最初に質問をし、次に動機を尋ねます。最後に、期待どおりにコンパイルおよび実行される例示的なコード サンプルを示します。
質問
イテレータを使用する必要がある期間中にイテレータが無効化されないことを確信できる場合、イテレータへのポインタ (たとえば、 a へのポインタlist<int>::iterator
) を保持しても安全ですか。
動機
複数のコンテナーがあり、あるコンテナーに保持されているアイテムから別のコンテナーに保持されている対応するアイテムへの直接の相互参照が必要です。あるコンテナ内のアイテムが、別のコンテナ内に対応するアイテムを常に持っているとは限りません。
したがって、私の考えは、コンテナー #1 に格納されている要素内のコンテナー #2 内の要素へのイテレーターへのポインターを格納することです。なんで?イテレータを取得すると、コンテナ #2 の要素にアクセスできるだけでなく、必要に応じてコンテナ #2 の要素を消去することもできます。
コンテナー #2 に対応する要素があれば、コンテナー #1 の要素にイテレーターへのポインターを格納します。それ以外の場合、このポインターは NULL に設定されます。これで、イテレータへのポインタが NULL の場合、コンテナ #2 に対応する要素がないことをすばやく確認できます。NULL でない場合は、先に進んでそれにアクセスできます。
では、この方法でイテレータへのポインタを格納しても安全でしょうか?
コードサンプル
#include <iostream>
#include <list>
using namespace std;
typedef list<int> MyContainer;
typedef MyContainer::iterator MyIterator;
typdef MyIterator * PMyIterator;
void useIter(PMyIterator pIter)
{
if (pIter == NULL)
{
cout << "NULL" << endl;
}
else
{
cout << "Value: " << *(*pIter) << endl;
}
}
int main()
{
MyContainer myList;
myList.push_back(1);
myList.push_back(2);
PMyIterator pIter = NULL;
// Verify for NULL
useIter(pIter);
// Get an iterator
MyIterator it = myList.begin();
// Get a pointer to the iterator
pIter = & it;
// Use the pointer
useIter (pIter);
}