我正在努力了解安全地存储容器中项目的引用或指针的最佳方法,而不会冒指针无效的风险。
对于std::vector
,这似乎是一个坏主意,因为您永远不知道您的项目何时可能会移动到新的内存位置vector
重新分配。有这样的方式吗?
使用list
和deque
这是一个更好的选择吗?根据我的理解,这些集合中的项目不会移动,所以我可以只指向特定元素的内存地址吗?
我来自Objective-C,因为Objective-C几乎都使用指针来解决所有问题,因此这些东西很容易和所有容器都很常见,因此抛弃它们并复制它们是非常普遍的。
答案 0 :(得分:3)
对于std::vector
,您可以使用reserve
成员函数来确保为所需的最大元素数预分配连续的内存块。这意味着除非超出保留容量,否则不会复制元素。
插入或删除元素时,std::deque
中元素的所有指针也会失效。但是,除了指向要擦除的元素的指针之外,保证std::list
不会使这些情况下的任何指针无效。
答案 1 :(得分:0)
列表是序列容器,允许您在任何位置插入和擦除并在两个方向上迭代。列表与向量相比的主要缺点是它们无法通过位置直接访问元素。
Deques也是序列容器。它们具有动态尺寸,可以在两端扩展或收缩。它们与向量非常相似,可以让您根据位置直接访问元素。
你需要问问自己:我需要对容器做什么样的操作?
请注意,list和forward_list在操作时保留容器的有效性,而deque使其无效。
访问http://www.cplusplus.com/以获取有关c ++中容器的更多信息。
答案 2 :(得分:0)
解决方案是让向量保持指向对象的指针,而不是直接包含对象。然后你不必担心向量调整大小,因为当它调整大小时,对象将保留在内存中的原始位置。