iteratorの再利用について
コンテナの内容を変えた後に内容を変える前のiteratorを使用することはできないと聞きました。ので、連続して何らかのコンテナ内のデータを変更しつつ、探索する場合にも、iteratorは最初から探索を始めないといけないと思っています。
例えば以下のように
#include <stdio.h>
#include <list>
struct data
{
int value;
data(int value)
{this->value = value;}
};
typedef std::list<data> DataList;
typedef std::list<data>::iterator DataIterator;
bool EraseValue(DataList*dataList, int value)
{
DataIterator iterator= dataList->begin();
while(iterator != dataList->end())
{
if(iterator->value == value)
{
dataList->erase(iterator);
return true;
}
iterator++;
}
return false;
}
int main()
{
//データを入れる
DataList dataList;
for(int i=0;i<10; i++)
dataList.push_back(data(i));
//指定のデータを探し、消す
int Value[] = {4,5,7};
EraseValue(&dataList, Value[0]);
EraseValue(&dataList, Value[1]);
EraseValue(&dataList, Value[2]);
//結果表示
DataIterator iterator = dataList.begin();
while(iterator != dataList.end())
{
printf("%d\n",iterator->value);
iterator++;
}
return 0;
}
ここで、新しい値の探索を始めるたびに、最初から探索をはじめる部分が無駄であると思っています。探索するデータは、上の例のように、必ず前回探したものの後にあることはわかっているとして、これより効率のよい方法はないでしょうか?自分の中での理想は、削除したiteratorの直前に使った(削除されていない)iteratorの位置から探索を始めるのがいい思っているのですが、これはどうやらできないこと(やってはいけないこと?)の様です。
コンテナをstd::listに限定した場合でも構いません。
ご教授よろしくお願いします。