ali*_*hoo 20 c++ pointers stl memory-address
给定一个非连续的STL容器(您也可以考虑boost::unordered_map并boost::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在整个执行,如果我不删除abc的abc_list.
我问这个是因为我要用ABCC++/Cli ABC包装类,所以我需要指向包装类中的实例的指针.ABC是一个简单的类,我希望容器处理内存.如果答案是否定的话我将使用std::list<ABC*>.
Arm*_*yan 28
std::list,std::set并std::map保证在添加或删除新元素时,迭代器(包括简单指针)不会失效.
C++ 标准对引用/迭代器的有效性制定了严格的规则。对于每个容器,每个方法都会记录哪些元素可以被移动(使引用和迭代器无效)。
基于节点的容器:list、map、和保证只要元素未从容器中删除,元素的引用和迭代器将保持有效set。multimapmultiset
因此,您的用例是使用 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
| 归档时间: |
|
| 查看次数: |
8490 次 |
| 最近记录: |