【问题标题】:STL-like vector with arbitrary index range具有任意索引范围的类 STL 向量
【发布时间】:2010-10-08 01:12:14
【问题描述】:

在访问复杂性、调整大小时重新分配等方面,我想要的是类似于 STL 向量的东西。我希望它支持任意索引范围,例如可以有从 -2 到 +7 或从 + 索引的元素5 到 +10。我希望能够有效地 push_front。我也想要双向调整大小...

我知道我可以自己写这样的东西,但是如果有已经写好的库支持这个,请告诉我。

【问题讨论】:

    标签: c++ stl vector deque


    【解决方案1】:

    给你,双端向量

    http://dl.dropbox.com/u/9496269/devector.h

    用法:

    • 要在begin() 之前保留内存,请使用reserve(new_back_capacity, new_front_capcity);

    • 除了使用push_front()、pop_front() 和squeeze() 时,始终保留前容量。

    • squeeze() 刷新所有未使用的内存

    • 默认namespace; stdext

    概念:

    • 在大多数情况下等同于 ::std::vector,但具有 push_front 能力

    • 与::std::vector 相比没有性能差异(与::std::deque 不同)

    • 与::std::vector相比有四个字节的开销

    【讨论】:

      【解决方案2】:

      Deque 很像一个向量,它支持随机访问和末尾的高效插入,也支持开头的高效插入。

      Map 支持基于任意键的访问,你可以有任何你想要的范围,甚至是一个稀疏的数组。对集合的迭代很慢。

      Unordered map (tr1) 与 map 类似,只是它支持更好的迭代。

      作为一般经验法则,使用向量(在您的情况下使其适应您想要的行为)并且仅在您有证据表明该向量导致缓慢时才进行更改。

      【讨论】:

      • 查找映射中的给定键很慢 (O(log n))。地图上的迭代很快——每个元素摊销 O(1) 时间。
      • 看起来 deque 是答案。谢谢,我只是不知道容器的名称。 @random_hacker 我想要快速随机访问且无需密钥的东西。
      • 双端队列的内存使用量并不比向量大得多。他们也不需要在调整大小时复制任何现有元素。您可以将实现视为向量的链接列表。要添加更多元素(正面或背面),您只需在现有节点已满时添加另一个节点。
      • @j_random_hacker。在 O(N) 的双端队列或 O(log N) 的地图上找到什么更快? O(1) 并不意味着快,它只是意味着无论你的集合大小如何,它都是一样的。
      • @KeithB 我已经删除了该信息。
      【解决方案3】:

      如果您想要 2 路调整大小等...您可以创建自己的矢量类,其中包含 2 个矢量 一个用于 0 和正值,另一个用于负值。

      然后只需实现常用函数并添加新函数(例如:push_begin 添加到负索引向量),并更新里面的对应向量。

      【讨论】:

      • 与“push_begin”相同,您必须跟踪开始的索引,以便 _v1[10] 为 _v1[10 - startIndex]。双端队列也有同样的问题...
      【解决方案4】:

      您想要的和向量之间的唯一区别似乎是访问元素所需的偏移量,如果通过重载运算符 [] 或其他东西,您需要注意。除非我不明白你所说的双向调整大小是什么意思。

      【讨论】:

      • 这有助于我覆盖双端队列的 [] 并计算前推的数量。
      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      相关资源
      最近更新 更多