【问题标题】:append a rvalue vector to a vector in O(1) time在 O(1) 时间内将右值向量附加到向量
【发布时间】:2021-07-23 18:35:37
【问题描述】:

我想知道如何以恒定时间 (O(1)) 将右值向量附加到另一个向量。 我知道使用std::insertstd::move 的方法,但是有什么方法可以在O(1) 时间内将std::vector<T>&& 附加到std::vector<T>&

【问题讨论】:

  • 简答:没有。
  • 标准要求 std::vector 在内存中是连续的。因此 append 必须一次向目标 std::vector 添加一个元素,并根据需要扩展它的后备存储。
  • 好的,那么可以使用的数据结构列表是什么,unordered_setunordered_map 等数据结构是否可以实现?
  • @Vishnu: 不。你正在寻找一个链表,它几乎是唯一具有 O(1) 插入时间的数据结构(你必须使用 splice 来获得 std::list这个)。
  • 请记住,虽然插入是使用链表的廉价操作,但您现在所做的几乎所有其他操作都更多昂贵。贵多少以及增加的费用是否超过更便宜的插入的收益取决于使用模式。

标签: c++ c++17 rvalue


【解决方案1】:

为什么右值与这无关? Big-O 表示法计算进程中完成的操作数。无论这些操作是复制还是移动,如果执行的操作数与源列表中的项目数成正比,那么它是一个O(n)过程。

如果你要将一个连续的元素序列复制/移动到另一个连续的元素序列中,结果是连续的,那么该过程必须是 O(n)(至少),其中 n 是数字源序列中的元素。即使它对源元素进行了memcpymemcpy 的某个序列 Ts 对序列中 Ts 的数量也是 O(n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    相关资源
    最近更新 更多