保持对容器项的单独指针

时间:2013-05-08 11:53:48

标签: c++

我正在努力了解安全地存储容器中项目的引用或指针的最佳方法,而不会冒指针无效的风险。

对于std::vector,这似乎是一个坏主意,因为您永远不知道您的项目何时可能会移动到新的内存位置vector重新分配。有这样的方式吗?

使用listdeque这是一个更好的选择吗?根据我的理解,这些集合中的项目不会移动,所以我可以只指向特定元素的内存地址吗?

我来自Objective-C,因为Objective-C几乎都使用指针来解决所有问题,因此这些东西很容易和所有容器都很常见,因此抛弃它们并复制它们是非常普遍的。

3 个答案:

答案 0 :(得分:3)

对于std::vector,您可以使用reserve成员函数来确保为所需的最大元素数预分配连续的内存块。这意味着除非超出保留容量,否则不会复制元素。

插入或删除元素时,std::deque中元素的所有指针也会失效。但是,除了指向要擦除的元素的指针之外,保证std::list不会使这些情况下的任何指针无效。

答案 1 :(得分:0)

列表是序列容器,允许您在任何位置插入和擦除并在两个方向上迭代。列表与向量相比的主要缺点是它们无法通过位置直接访问元素。

Deques也是序列容器。它们具有动态尺寸,可以在两端扩展或收缩。它们与向量非常相似,可以让您根据位置直接访问元素。

你需要问问自己:我需要对容器做什么样的操作?

请注意,list和forward_list在操作时保留容器的有效性,而deque使其无效。

访问http://www.cplusplus.com/以获取有关c ++中容器的更多信息。

答案 2 :(得分:0)

解决方案是让向量保持指向对象的指针,而不是直接包含对象。然后你不必担心向量调整大小,因为当它调整大小时,对象将保留在内存中的原始位置。