我正在寻找一种方法来将两个容器追加到恒定(或至少是最小的线性)时间。
我注意到链接list
的合并,但它似乎对元素进行排序。是不是有容器/方法只是将容器重新链接到另一个容器(比如list1.last_element.next = list2.first_element
)?
答案 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);