"剪切和粘贴" std :: vector的最后k个元素是否有效?

时间:2016-06-27 15:49:56

标签: algorithm c++11 stdvector

是否有可能在C ++ 11"剪切和粘贴" std :: vector A的最后k个元素到一个新的std ::: vector B在恒定时间内?

一种方法是使用B.insert(A.end() - k, A.end())然后在A上使用擦除,但这些都是O(k)时间操作。

2 个答案:

答案 0 :(得分:3)

不,矢量拥有他们的记忆。

此操作称为拼接。 forward_list否则会非常缓慢,但它确实有一个O(1)拼接。

通常,决定移动哪些元素的过程已经是O(n),因此使接头本身花费O(n)时间不是问题。其他操作在矢量上的速度要快于弥补它。

答案 1 :(得分:0)

一般来说,这是不可能的,因为(至少在C ++ 03版本中,它有23.2.4 / 1)C ++标准保证了{{{{ 1}}是一个连续的块。因此,转移&#34;的唯一方法是如果接收向量是空的,那么O(1)时间内的元素数量超过固定数量,并且你已经安排让它分配的内存块从正确的位置开始内部第一个向量 - 在这种情况下&#34;转移&#34;可以说它根本没有花时间。 (以这种方式故意重叠对象几乎肯定会在理论上构成未定义行为 - 并且在实践中,它也非常脆弱,因为使vector<T>的迭代器无效的任何操作也可以重新分配内存,因此破坏事物。)

如果您准备牺牲一大堆可移植性,我已经听说可以通过虚拟内存映射来玩OS级(或硬件级)技巧来实现无开销环缓冲区。也许这些技巧也可以在这里应用 - 但请记住,在一个过程中虚拟到物理内存的映射是一对一的假设是非常根深蒂固的,所以你可能会有一些惊喜。 / p>