指向STL容器元素的指针

ali*_*hoo 20 c++ pointers stl memory-address

给定一个非连续的STL容器(您也可以考虑boost::unordered_mapboost::multi_index_container考虑),如果没有删除任何元素,是否保证容器内元素的内存地址永远不会改变(但是可以添加新的容器)?

例如

class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());
Run Code Online (Sandbox Code Playgroud)

在其他的字将abc_ptr被指出abc在整个执行,如果我不删除abcabc_list.

我问这个是因为我要用ABCC++/Cli ABC包装类,所以我需要指向包装类中的实例的指针.ABC是一个简单的类,我希望容器处理内存.如果答案是否定的话我将使用std::list<ABC*>.

Arm*_*yan 28

std::list,std::setstd::map保证在添加或删除新元素时,迭代器(包括简单指针)不会失效.

  • 并且`deque`保证它在末端添加元素,这对于这种用途来说可能已经足够了. (5认同)

Mat*_* M. 5

C++ 标准对引用/迭代器的有效性制定了严格的规则。对于每个容器,每个方法都会记录哪些元素可以被移动(使引用和迭代器无效)。

基于节点的容器:listmap、和保证只要元素未从容器中删除,元素的引用和迭代器将保持有效setmultimapmultiset

因此,您的用例是使用 a 进行存储的最佳情况之一list,因为列表提供了失效保证。


小智 5

正如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