【问题标题】:Storing pointers to elements of a dynamic array存储指向动态数组元素的指针
【发布时间】:2020-05-27 18:43:56
【问题描述】:

我有两个数组,其中第一个由整数组成,另一个由结构组成,其中一个成员是指向第一个数组中给定元素的指针。

struct A {
   ...
   int *ptr;
};

int arr[100];
vector<A>arr2;

void AddElementAndAssignPointer(int index) {
    arr2.push_back({...});
    arr2.ptr = &arr[index];
}

现在这种方法的限制是第一个数组的大小是静态的,我希望它是动态的。但是,如果我将其设为 std::vector,则在调整向量大小并将内容复制到更大的数组中时,对该数组中元素的引用将会丢失。

这个问题有哪些可能的解决方案?

编辑:问题是我如何存储对数组元素的引用并同时让它是动态的。

编辑 2:我正在创建一个半边网格结构。第一个数组由网格的顶点组成。第二个阵列由网格的边缘组成。为了稍微简化问题,我需要为每条边设置一个指向顶点的指针。当用户添加新顶点时,顶点数组需要是动态的。

【问题讨论】:

  • 你真正想解决什么问题。这可能不是解决方案。
  • 这就是您在解决方案中遇到的问题。你为什么要引用数组,你想用你正在构建的这个数据结构做什么?
  • 使用std::list,而不是std::vector。然后你就不用担心失效了。当然,这可能只会掩盖你真正想要解决的问题。
  • @PaulMcKenzie 感谢您的建议!我刚刚添加了关于我的实际问题的评论。你认为std::list 会起作用吗?
  • std::list 将“工作”,问题是如果您希望std::liststd::vector 执行相同的操作,因为它不是随机访问容器。例如,您不能使用[ ] 访问元素。相反,您必须使用 std::advance 来访问相关元素。

标签: c++


【解决方案1】:

我相信标准的解决方案是,而不是存储一个实际的指针或任何东西(因为它们可以在调整 vector 的大小时四处移动),同时存储对向量的引用和用于索引的 size_t向量。

【讨论】:

  • 不幸的是,存储索引不是选项。对于具体问题,我需要存储指针。
  • 另外存储索引并不是一个很好的移动它的方法。由于向量及其索引可能与其他内容混合。最好的解决方案是 std::list 并将迭代器传递给它周围的元素
  • @LennyWhite 设计的哪一部分让你需要指针?
  • @TarickWelling 那么正确的答案是创建一个struct,它可以保存矢量引用和索引,也许使用辅助方法。 std::list 有很多其他问题可能会导致问题,尤其是在实践中而不是理论中;例如,它们对缓存不友好,因此迭代速度很慢。
  • 是的,你说得对,链表迭代起来不会很快……但乍一看,使用索引方法(或结构)看起来就像是一场噩梦。由于我的具体问题需要在顶点、边和面之间使用多个指针。而且这个数据结构的所有实现都使用指针。
猜你喜欢
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 2010-10-15
相关资源
最近更新 更多