在C++中,随机访问和push_back是否可能使元素无效?

Is random access and push_back without invalidating the elements possible in C++?

提问人:Ramster445 提问时间:4/27/2023 最后编辑:cafce25Ramster445 更新时间:4/29/2023 访问量:133

问:

基本上,我需要能够使用像 + 随机访问这样的操作,就像列表一样,同时还要保持其指针有效性,就像 do 一样。这可能吗?push_back()std::vectorstd::list

我正在使用指向列表中各种元素的指针,虽然提供对元素的随机访问,但所有内容都无效。std::vectorpush_back()

C++ 列表 迭代器 推回

评论

1赞 Nathan Pierson 4/27/2023
你可能想要一个 std::d eque ETA,不,你不需要,这会使迭代器失效。嗯。
0赞 Ted Lyngmo 4/27/2023
这些要求有多“一成不变”?你能复制数据吗?
1赞 Avi Berger 4/27/2023
使用索引而不是迭代器?
5赞 paddy 4/27/2023
如果您知道向量不会增长到超过特定大小,那么您可以预先确定该大小,然后知道您的操作不会使迭代器无效(除非),前提是您不超过初始容量。reserve()push_backend()
1赞 Dúthomhas 4/27/2023
@paddy 你应该把它写成答案:是的,这是可能的,iff......

答:

1赞 DreamerX 4/27/2023 #1

也许您听说过像哈希链表这样的数据结构?这种数据结构是链表的扩展,它在普通链表之上维护了一个额外的数组,这个数组的元素数与链表的元素数相同,只是它的元素是指向相应链表元素的指针。这种数据结构的优点是它允许随机访问并利用碎片内存。但这似乎与您的问题描述有些偏差?我不确定这是否能满足您的需求。

代码就是这样(很抱歉,我写答案的时间很少,所以我没有真正编译和运行它,也许代码还是有问题的,哈哈哈):

#include <list>
#include <vector>

templete<typename T>
class CHashList
{
public:
  std::list<T> m_data;
  std::vector<T*> m_pointer;
public:
  void push_back(T newData)
  {
    m_data.push_back(newData);
    m_pointer.push_back(&m_data.back());
  }
  T& operation[](int i)
  {
    return *m_pointer[i];
  }
  // other operations...
};

希望对您有所帮助。

0赞 vvv444 4/29/2023 #2

Boost's 为您的要求提供了现成的解决方案。stable_vector

从其文档中:

与向量一样,迭代器是随机访问的。 不提供元素连续性;作为这种缺席的交换,容器是稳定的,即只要元素不被擦除,对元素的引用和迭代器就保持有效。stable_vectorstable_vector