2

オブジェクトへのポインタのベクトルがあります。メンバー関数によって報告された属性に従って、このベクトルからオブジェクトを削除したいと思います。

ベクターから特定のポインター(およびそれらに関連するオブジェクト)を削除する方法について見つけた良い例に従おうとしています。基本的な考え方は、ベクトルを分割し、選択したオブジェクトを削除してから、それらのオブジェクトへのポインターを削除することです。以下は(ドブス博士からの)例です:

vector<Object *> v ;

v.push_back( new Object( ... ) ) ;
...
vector<Object *>::iterator last =
partition( v.begin(), v.end(), not1(predicate()) ) ;
for( vector<Object *>::iterator i = last ; i != v.end() ; ++i )
{
  delete *i ;
}
v.erase( last, v.end() ) ;

述語の適切な構文に困惑しています。私のオブジェクトはクラスStrainであり、私のベクトルはvector <Strain*>liveStrainsです。述語は、Strainメンバー関数isExtinct()である必要があります。以下は機能しません。

 vector< Strain * >::iterator last = partition( liveStrains.begin(), liveStrains.end(), not1(std::mem_fun_ref(&Strain::isExtinct)) );

オブジェクト自体ではなく、オブジェクトへのポインターでメンバー関数を呼び出そうとしていることがわかります。これを回避するには、&を*に変更してみました(私は明らかに初心者です)。また、メンバー関数でliveStrainsを更新するSimulationクラスのメンバー関数を作成してみました。うまくいかなかったものの詳細を調べる価値があるかどうかはわかりません。利用可能な構文オプション、または私がやろうとしていることが許可されているかどうかについて、私はひどく混乱しています。

助けてくれてありがとう。

4

1 に答える 1

1

解決策は、 std :: mem_fun_refではなく、オブジェクトへのポインター用に作成されたstd::mem_funを使用することです。

于 2009-10-28T15:49:39.210 に答える