Mar*_*ner 29 c++ pointers stl stdvector
我有std::vector一些类的元素ClassA.另外,我想创建一个索引,使用a std::map<key,ClassA*>将一些键值映射到指向向量中包含的元素的指针.
当在向量的末尾添加元素(未插入)时,是否保证这些指针保持有效(并指向同一对象).即,以下代码是否正确:
std::vector<ClassA> storage;
std::map<int, ClassA*> map;
for (int i=0; i<10000; ++i) {
storage.push_back(ClassA());
map.insert(std::make_pair(storage.back().getKey(), &(storage.back()));
}
// map contains only valid pointers to the 'correct' elements of storage
Run Code Online (Sandbox Code Playgroud)
情况怎么样,如果我用std::list而不是std::vector?
Dum*_*der 25
向量 - 否.因为向量的容量永远不会缩小,所以即使删除或更改了元素,也可以保证引用,指针和迭代器保持有效,只要它们引用操作元素之前的位置即可.但是,插入可能会使引用,指针和迭代器无效.
列表 - 是的,插入和删除元素不会使指针,引用和其他元素的迭代器无效
用std::deque!仅push_back()在使用时,元素的指针是稳定的.
注意:元素的迭代器可能无效!指向元素的指针不会.
编辑:这个答案解释了原因:在push_front()之后C++ deque的迭代器失效