21

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

例如

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

换句话说,如果我abc_ptr不从.abcabcabc_list

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

4

4 回答 4

30

std::list, std::set, 并std::map保证在添加甚至删除新元素时迭代器(包括简单指针)不会失效。

于 2011-03-03T14:42:27.860 回答
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

于 2011-03-03T14:57:22.223 回答
4

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

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

因此,您的用例是使用 alist进行存储很好的极端情况之一,因为 list 提供了失效保证。

于 2011-03-03T14:54:44.037 回答
-1

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

这有很多优点:

  • 您可以分享它们并传递它们,而不必担心释放它们
  • 指针的垃圾收集
  • 你一开始就没有传递指针
于 2011-03-03T14:42:06.223 回答