指向STL容器元素的指针

时间:2011-03-03 14:37:10

标签: c++ pointers stl memory-address

给定一个非连续的STL容器(您也可以考虑boost::unordered_mapboost::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*>

4 个答案:

答案 0 :(得分:28)

std::liststd::setstd::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 ++标准对引用/迭代器的有效性提出了严格的规定。对于每个容器,每个方法都会记录移动哪些元素 (使引用和迭代器无效)。

基于节点的容器:listmapsetmultimapmultiset保证元素的引用和迭代器保持有效,只要该元素不会从容器中删除。

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

答案 3 :(得分:-1)

我认为最好使用std::list <shared_ptr <ABC> >而不是传递指针。 委派内存管理是一种很好的做法(参见scott meyers有效的c ++)

这有很多优点:

  • 你可以分享它们并传递它们而不必担心释放它们
  • 指针的垃圾收集
  • 你没有首先传递指针