给定一个不连续的STL容器(您也可以考虑boost::unordered_map
和boost::multi_index_container
),如果没有删除任何元素(但可以添加新的元素),是否可以保证容器内元素的内存地址永远不会改变?
例如:
class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());
换句话说,如果我不从abc_ptr
中删除abc
,那么在整个执行过程中,abc_list
会被指向abc
吗?
我之所以这样问,是因为我要用C++/Cli包装类ABC
,因此我需要指向包装器类中ABC
实例的指针。ABC是一个简单的类,我想让容器来处理内存。如果答案是否定的,那么我将使用std::list<ABC*>
。
发布于 2011-03-03 22:42:28
std::set
和std::map
保证迭代器(包括简单指针)在添加甚至删除新元素时不会失效。
发布于 2011-03-03 22:57:22
正如Armen提到的,std::list、std::set和std::map只能使已删除的迭代器无效。在boost::unodered_map的情况下,修饰符确实可能使迭代器无效。
http://www.boost.org/doc/libs/1_38_0/doc/html/boost/unordered_map.html
发布于 2011-03-03 22:54:44
C++标准对引用/迭代器的有效性设置了严格的规则。对于每个容器,每个方法都记录了哪些元素可以移动(使引用和迭代器失效)。
基于节点的容器:list
、map
、set
、multimap
和multiset
保证,只要元素没有从容器中删除,对元素的引用和迭代器就会保持有效。
因此,您的用例是使用list
进行存储的最佳案例之一,因为list提供了无效保证。
https://stackoverflow.com/questions/5182122
复制相似问题