我正在寻找一个容器来保存它在内存中包含对象的位置(它的指针仍然有效)
容器会不断增长和缩小。中间的元素可能会被删除,但中间没有插入;所有元素都被推到容器的背面。在这种情况下,迭代器的有效性并不重要,我唯一关心的是指针仍然有效。
在这种情况下,std::deque
是否是安全有效的选择?我之前使用的是list,但它分配的次数太多,无法在此实例中使用。
答案 0 :(得分:4)
没有。 std::deque
必须使用块实现。在块的中间擦除至少会使该块中所有后续元素的地址无效。
请注意,迭代器失效和指针失效通常是紧密相连的。迭代器通常是指向(节点持有)元素的指针,并添加了适当的迭代语义。这些迭代器失效,因为它们包含的指针无效。
答案 1 :(得分:1)
在中间插入或删除元素会使所有迭代器和引用无效。
在开头/结尾插入元素会使迭代器无效,但不会影响引用。
删除开头/结尾处的元素不会影响迭代器或引用,除了指向已删除元素的元素,以及可能是过去的迭代器。
http://en.cppreference.com/w/cpp/container/deque/erase
除非擦除的元素位于容器的末尾或开头,否则所有迭代器和引用都将失效,在这种情况下,只有迭代器和对擦除元素的引用才会失效。
http://en.cppreference.com/w/cpp/container/deque/push_back
所有迭代器(包括过去的迭代器)都将失效。没有引用无效。
(对前或后元素进行操作的其他方法也有相似的注释)。
答案 2 :(得分:-2)
与std :: vector相反,deque的元素不是连续存储的:典型的实现使用一系列单独分配的固定大小的数组。 双端队列的存储会根据需要自动扩展和收缩。扩展deque比std :: vector的扩展便宜,因为它不涉及将现有元素复制到新的内存位置