【问题标题】:Is there a container like the one I am asking for?有没有像我要求的那样的容器?
【发布时间】:2014-11-29 12:17:13
【问题描述】:

我希望实现一个具有以下属性的 c++ 容器对象:

  1. 将所有元素连续保存在内存中,以便可以对其进行迭代而不会导致任何缓存未命中。
  2. 可扩展,不像固定大小的数组,但很像 stl 中的向量,它可以调整分配的内存以容纳我添加的尽可能多的元素。
  3. 在调整大小时不会将元素重新分配到内存中的新位置,就像在 std 向量的情况下一样。我需要保留指向容器中元素的指针,因此在添加新元素时重新分配指针不应失效。
  4. 必须与基于范围的 for 循环兼容,以便可以有效地迭代内容。

在任何外部库中是否有满足这些要求的容器,或者在这种情况下我必须实现自己的容器吗?

正如一些 cmets 所指出的,并非所有所需的属性都可以一起实现。我应该解决这个问题,并且我有一个实施方案。由于使事物完全连续是不可能的,因此可以适应一些不连续性。例如,数据容器最初为 10 个元素分配空间,当达到上限时,分配另一块内存,是前一个块的两倍,但不会将现有元素复制到该新块。相反,它用我放入其中的新元素填充新块。这样可以最大限度地减少不连续性。

那么,有没有已经实现的数据结构?

【问题讨论】:

  • #1 和 #3 是不兼容的要求。
  • 难道你不知道#1+#2 与#3 直接矛盾吗?如果某些东西是可扩展的,则没有办法在不重新分配的情况下“扩展”它,除非您允许其内存不连续,或者预先分配最大大小。
  • 你最后的想法是std::forward_list<std::array<T, N>>
  • @TheParamagneticCroissant 你能教我如何使用它吗?我有点糊涂了??????

标签: c++ containers data-containers


【解决方案1】:

恕我直言,最接近您需要的数据结构是 deque 在 STL 中。基本上它存储大量连续的记忆和 提供随机访问迭代器和关于 push_back 的稳定性 (尽管迭代器无效,但您的元素仍保留在同一位置)。 您的约束的唯一问题是内存不连续 无处不在,但正如其他人评论的那样,如果您愿意,您的需求集是不兼容的 完全满足他们所有人。 顺便说一句,这个容器的一个甜蜜的事情是你也可以推动 前面。

【讨论】:

  • 是的,一个双端队列看起来非常接近,但是根据我从阅读msdn.microsoft.com/en-us/library/t4x090h4.aspx 得到的对双端队列的理解,每个块的大小是固定的。你知道有哪些数据结构表现得像双端队列,但块的大小呈指数级增长?
  • 我指的是这个链接,而不是那个:cpp-tip-of-the-day.blogspot.in/2013/11/…
  • 不,我不...但是同时拥有随机访问迭代器和不同的块大小似乎很困难。
  • 我真的可以取消随机访问。有没有办法可以指定这个固定大小是多少?
  • @OliverCharlesworth 一种用途是我想确保某些块(给定大小的)在其内容被同时访问时连续存储。
猜你喜欢
  • 2019-07-08
  • 2019-05-17
  • 1970-01-01
  • 2020-12-24
  • 2016-02-04
  • 1970-01-01
  • 2016-06-19
  • 2013-04-11
  • 2016-12-03
相关资源
最近更新 更多