0

2つのイテレータを使用してクラスのベクトル内の要素を比較するための最も効率的で最速の方法は何ですか?ベクトルはソート可能ではなく、クラスにオーバーロードされた">"演算子があります。単純なベクトル反復にはboostforeachを使用します。

私は以下のようなことをしています。

vector<TestClass*> vec; 
vector<TestClass*>::iterator jIter;     
bool isErased=false;
vector<TestClass*>::iterator iIter = vec.begin();
if(!vec.empty()){
    while(iIter < vec.end()-1) {            
        isErased = false;
        for (jIter = iIter+1; jIter < vec.end();jIter++) {          
            if((*(*iIter))<=(*(*jIter))) {
                delete *jIter;
                jIter = vec.erase(jIter);               
                jIter--;
            }               
            else if((*(*iIter))>=(*(*jIter))) {                 
                delete *iIter;
                iIter = vec.erase(iIter);
                isErased = true;
                break;
            }               
        }
        if(!isErased) iIter++;
    }               

ありがとうございました。

4

2 に答える 2

1

最もトリッキーな部分は、無効化されたイテレータに遭遇しないようにすることです:

v.erase(std::remove_if(v.begin(), v.end(), [j](T const &i) { return i > j; });

ループを使用することもできますが、その場合は逆反復子を使用します

PS:アルゴリズムで実際に達成したいことを理解できません

あなたは興味があるかもしれません

于 2012-11-28T19:30:43.553 に答える
0

未確認ですがこんな感じ。

 for(auto it=vec.begin(), end=vec.end(); it!=end; ++it) {
   const auto&& val=*it;
   std::size_t count=0u;
   end=std::remove_if(
       it, end,
       [&](const TestClass& tc) -> bool {
           if(tc==val) ++count;
           return (count > 1);
       }
   );
 }
 vec.erase(end, vec.end());
于 2012-11-28T19:30:14.763 に答える