在恒定时间附加两个容器

时间:2013-09-02 19:48:08

标签: c++ c++11

我正在寻找一种方法来将两个容器追加到恒定(或至少是最小的线性)时间。

我注意到链接list的合并,但它似乎对元素进行排序。是不是有容器/方法只是将容器重新链接到另一个容器(比如list1.last_element.next = list2.first_element)?

2 个答案:

答案 0 :(得分:7)

您可以使用std::list::splice方法:

std::list<int> list1;
std::list<int> list2;

list1.splice(list1.end(), list2, list2.begin(), list2.end());

此代码会将list2的内容附加到list1的末尾。

正如Dietmar Kuhl所提到的,该方法需要计算您插入范围内的元素:

[list2.begin(), list2.end())

因此,如果您提供范围,则复杂性是线性的。但是,如果您知道要添加整个列表,则只需执行

即可
list1.splice(list1.end(), list2);

O(1)时间。

答案 1 :(得分:2)

对于std::list<T>,可以使用splice()将节点从一个列表传输到另一个列表。遗憾的是,当指定使用两个迭代器和splice()两个std:list<T>对象之间的范围时,此方法在拼接序列的长度上被破坏为线性。进行此更改有利于持续size()次操作。

std::list<T> l1({ 1, 2, 3 });
std::list<T> l2({ 4, 5, 6 });
l1.splice(l1.end(), l2);