首先提出问题,接着解释动机,最后给出一个编译并执行正常的示例代码。
问题
如果我能确保迭代器在使用期间不会失效,那么持有迭代器的指针(例如指向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);
}
end
迭代器表示NULL
呢? - user1773602optional<MyIterator>
的Boost Optional,效果很好。 - kman