给定一个非连续的STL容器(您也可以考虑boost::unordered_map
和boost::multi_index_container
),是否保证容器内元素的内存地址在没有元素的情况下永远不会改变被删除,(但可以添加新的)?
e.g。
class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());
换句话说,如果我不从abc_ptr
删除abc
,则abc
会在整个执行期间指向abc_list
。
我问这个是因为我要在C ++ / Cli中包装类ABC
,所以我需要指向包装类中ABC
个实例的指针。 ABC是一个简单的类,我希望容器处理内存。如果答案为否,那么我将使用std::list<ABC*>
。
答案 0 :(得分:28)
std::list
,std::set
和std::map
保证在添加或删除新元素时,迭代器(包括简单指针)不会失效。
答案 1 :(得分: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
答案 2 :(得分:4)
C ++标准对引用/迭代器的有效性提出了严格的规定。对于每个容器,每个方法都会记录移动哪些元素 (使引用和迭代器无效)。
基于节点的容器:list
,map
,set
,multimap
和multiset
保证元素的引用和迭代器保持有效,只要该元素不会从容器中删除。
因此,您的用例是使用list
进行存储的最佳情况之一,因为无效保证了列表提供。
答案 3 :(得分:-1)
我认为最好使用std::list <shared_ptr <ABC> >
而不是传递指针。
委派内存管理是一种很好的做法(参见scott meyers有效的c ++)
这有很多优点: