【问题标题】:What variations of vector-like containers already widely established? Do I have to write my own? [closed]已经广泛建立的类矢量容器有哪些变体?我必须自己写吗? [关闭]
【发布时间】:2021-07-28 06:00:27
【问题描述】:

在我的程序中,我经常需要一个拥有类似数组的容器 - 即用于连续存储在内存中的数据,但向量太灵活,实用性或效率都低于其应有的水平。

要求与std::vector 在一个或多个方面有所不同,例如:

  • 元素只能插入到最后,不能移动其他元素
  • 构造后/编译后无法更改容量
  • 构建后/编译后无法更改大小
  • 存储是类中固有的,不涉及分配器
  • 对于像std::vector<bool> 这样的单一类型没有奇怪的特殊情况
  • 引用和/或迭代器在插入时不会失效

如有必要,我将自己实现这样一个容器,但它可能已经存在于标准库或像 Boost 这样的流行库中。

问题是,它可能很难找到,也许它有一个你没想到的花哨的名字。那么,上述参数空间中存在哪些类向量容器?

即使现有容器不能满足我的要求,参考列表也会有所帮助:如果我最终实现了一个新容器,我可以采用适当的名称并避免混淆名称。

【问题讨论】:

  • 这个问题的“和/或”太多了。运行时大小的数组与编译时大小的数组非常不同,并且可以以固定容量调整大小的数组与其他数组非常不同。您基本上似乎是在要求vector每一个可能的变化,也许是假设每一个可能的变化都以某种方式代表着某种效率的提高。
  • “你基本上似乎在询问向量的每一种可能的变体”one 变体,而不是关于任何特定的变体。所要求的信息是已经确立的变化。所以再次不是“所有可能的变化”。如果我问到一个特定的,答案自然会集中在那个上,即“这被广泛称为 foo_vector,使用它”或“不广泛可用,自己写”。
  • "问题是关于一种变体,而不是任何特定的变体。所要求的信息是哪些变体是公认的。" 这是一个矛盾。如果您要询问“一种变体”,则可以询问复数形式的“变体”。
  • 这个问题是being discussed on Meta

标签: c++ arrays boost stdvector stdarray


【解决方案1】:

以下是我所知道的:

还有“变长数组”和“有运行时边界的数组”,在C++中存在;前者存在于 C 中。有关这些非 C++ 容器,另请参阅 this questionthis answer

让我们比较所有这些的功能。如果您想要的容器与以下任一行不完全匹配,您需要实现自己的容器并为其选择一个名称。

Criterion C array array vector unique_ptr valarray dynarray static_vector small_vector stable_vector
Origin/library language std std std std discarded std Boost Boost Boost
Type parameters T,N T,N T,A T T T T,C,O T,N,A,O T,A
Capacity fix time Compile Compile Never (Construct) Never Construct Compile Never Never
Size fix time Compile Compile Never N/A Never Never Construct Never Never
Size = capacity always? N/A
Storage typically on Stack Stack Heap Heap Heap Heap Stack Stack/Heap Heap
Stable iterators? N/A N/A N/A N/A N/A (✔)
Constraint on element type

模板参数图例:

  • 分配器的一个
  • T 表示元素类型
  • N 表示元素数量的大小
  • C 表示元素数量的容量
  • O 表示选项

最后,一个有趣但不太流行的类矢量容器是"veque",或双端队列矢量汞合金。

【讨论】:

  • 您是否只是为这个答案写了所有这些,或者是否有信息的源链接?这将有助于增加没有错误出现的信心。而且,我真的认为唯一符合这个问题的就是static_vector(如果明智地使用也许 VLA)。其他事情似乎与所询问的内容相反(例如stable_vector
  • @sehe: 1. 我自己,我一直把 valarry 和 dynarray 混为一谈,并且不得不查找它们;并且忘记了已经实现的容器是容量固定在构造上且大小可变的容器,还是容量和大小都固定在构造上的容器。我一直记得 dynarray 就是这样,而实际上并非如此。因此,我决定将它们全部制作成一个表格 2。我添加了一个“等”。到问题措辞,使与答案的对应关系更清晰。
  • 哦。我现在看到您并没有试图要求特定的容器。当我阅读这个问题时,我仍然觉得您要求一个满足所有指定标准的特定容器(您自己会知道,但是仅在必要时)。您介意我提出修改以澄清问题吗?
  • @sehe:不,我不介意,实际上我认为所有用户都应该在不给予明确许可的情况下接受建议的编辑。我的意思是,这就是该网站的用途,它是一个集体编辑的问答。继续前进。当然,这并不意味着我会喜欢编辑 - 但如果我不喜欢,我会改回或评论它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 2013-12-30
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多