2016-01-11 10 views
5

私は状況があります。私は私の仕事の一つにテンプレート関数を使用しました。この関数には、イテレータを参照渡しします。今、私はベクトルからいくつかの要素を削除する必要があります。どのようにイテレータだけを使ってこれを行うのですか?それぞれのコードを見つける:ベクトルを知らずにイテレータを使用して要素を削除

template <class BidirectionalIterator, class Iterator> bool 

SomeFunc(BidirectionalIterator& first, BidirectionalIterator& last, Iterator anotherVecBegin) 
{ 
    while((first+1) != last) 
    { 
     if(some_condition) 
      // delete (first); HOW? 
     else if(some_other_condition) 
      // delete (first + 1); HOW? 
    } 

    // add something to another vector using anotherVecBegin 

    return true; 
} 

多くの質問がありますが、それらはすべてコンテキスト内のベクトルを持っています。だからmyVec.erase(*first)は簡単です..

私は、それが私がイテレータを参照して渡す非常に良い方法ではないことも承知しています。しかし、私は単純なルールに従っています。何かが変更されることが予想されるときに参照を使用するか、重複コピーを避けるためです。私のシナリオは最初の条件に合っています。

だから私はどのように削除しますか?

答えて

6

コンテナ要素のイテレータがすべてある場合は、コンテナを変更できません。イテレータの全体的なポイントは、要素の範囲の概念からコンテナの概念を分離しているため、前者のことを気にすることなく後者の観点からアルゴリズムを普遍的に表現することができます。そのため、範囲を変更するremoveアルゴリズムがあり、の要素をコンテナから消去するのに適したイテレータを返しますが、コンテナを知っている人が消去を行う必要があります。

+1

['std :: erase(std :: remove_if())' idiom](http://en.cppreference.com/w/cpp/)を参照してください。アルゴリズム/削除) – YSC

+1

@YSC 'std :: erase'とは​​思えません。要は、 'std :: vector :: erase'を呼び出す' std :: vector'インスタンスが必要です。 – juanchopanza

+0

@juanchopanzaここにはありません。私は編集することはできません。月曜日の朝の誤字。 – YSC

2

できません。コンテナから要素を削除すると、すべてのイテレータが無効になるため、削除するたびにfirstlastを更新する必要があります。

+0

_ "コンテナから要素を削除すると、すべてのイテレータが無効になります" _ - これは間違っています。異なるコンテナには、消去のためのイテレータ無効化ルールが異なります。例えば、http://stackoverflow.com/a/6442829/6345を参照してください。 –

2
  1. 標準ライブラリ:コンテナへの参照を取得するか、削除した場所を持っている場所に削除を延期する必要があります。その周りに道はない。要素を追加または削除するにはコンテナが必要であり、イテレータからコンテナを見つける方法はありません。

    さらに、ベクトルを消去すると、そのベクトルのすべてのイテレータが無効になることを忘れないでください。

  2. その他のライブラリ:Boost.Intrusiveには、オブジェクトへのポインタ(イテレータとしても機能します)だけで何かを行うことができるコンテナがありますが、ほとんどの場合、ベクトルよりも効率が低いリンクリストです。

関連する問題