1

私は次のコードを持っています(ここに入力しただけで、タイプミスなどがあるかもしれません):

typedef boost::ptr_vector<SomeClass> tvec;
tvec v;

// ... fill v ...

tvec vsnap;

for(tvec::iterator it = v.begin(); it != v.end(); ++it)
{
   if((*v).anyCondition)
       vsnap.push_back( it ); // (*it) or &(*it) doesn't work
}

私の問題は、イテレータをプッシュバックできないことです。イテレータからポインタを取得できません。

Is there an easy way i didnt see, or are boosts ptr_vector the false choice for this case?

Thanks in advance.

4

2 に答える 2

2

ptr_vector::iterator を逆参照すると参照が得られます。次に、 & を使用してその参照のアドレスを取得できるので、vsnap.push_back(&(*it))コンパイルする必要があります。どのようなエラーが発生していますか?

また、使い方が間違っていることに注意してください。オブジェクトのアドレスをどう処理しても、古い ptr_vector がオブジェクトを所有します。したがって、あなたのコードでは、同じオブジェクトを所有する 2 つの ptr_vectors を持つことになります。その後、両者はそれを削除しようとし、あなたはクラッシュします。おそらく代わりに所有権を譲渡したいでしょう:

vsnap.push_back(v.release(it));

もちろん、これは新しいベクトルに追加する前に古いベクトルからオブジェクトを削除します。オブジェクトを両方のベクトルにとどめたい場合は、std::vector または std::vector > を使用できます。もう 1 つの方法は、最初のものを boost::ptr_vector のままにし、2 番目のものを何も所有せず、元のベクター内のオブジェクトを指すだけの std::vector にすることです。その場合は、寿命に注意する必要があります。

于 2010-03-22T16:27:41.223 に答える
0

最初のベクターが保持するオブジェクトを複製する必要があります。

for(tvec::iterator it = v.begin(); it != v.end(); ++it)
{
   if((*v).anyCondition)
      vsnap.push_back(new_clone(*it));
}
于 2010-03-22T16:26:59.727 に答える