C++ 在固定时间内附加两个容器

C++ 在固定时间内附加两个容器,c++,c++11,C++,C++11,我正在寻找一种在恒定(或至少最小线性)时间内附加两个容器的方法 我注意到linkedlists merge,但它似乎对元素进行了排序。是否有一个容器/方法可以将一个容器重新链接到另一个容器(例如,像list1.last\u element.next=list2.first\u element)?您可以使用以下方法: 因此,如果你提供一个范围,复杂性是线性的。但是,如果您知道要附加一个完整的列表,只需执行以下操作即可 list1.splice(list1.end(), list2); 在O(1)

我正在寻找一种在恒定(或至少最小线性)时间内附加两个容器的方法

我注意到linked
list
s merge,但它似乎对元素进行了排序。是否有一个容器/方法可以将一个容器重新链接到另一个容器(例如,像
list1.last\u element.next=list2.first\u element
)?

您可以使用以下方法:

因此,如果你提供一个范围,复杂性是线性的。但是,如果您知道要附加一个完整的列表,只需执行以下操作即可

list1.splice(list1.end(), list2);
O(1)
time.

中,您可以使用以下方法:

因此,如果你提供一个范围,复杂性是线性的。但是,如果您知道要附加一个完整的列表,只需执行以下操作即可

list1.splice(list1.end(), list2);
O(1)
时间中。

对于
std::list
splice()
,可用于将节点从一个列表转移到另一个列表。遗憾的是,当使用两个迭代器和两个
std:list
对象之间的
splice()
ing指定一个范围时,这种方法在拼接序列的长度上被破坏成线性。此更改有利于使用恒定时间
size()
操作

std::list<T> l1({ 1, 2, 3 });
std::list<T> l2({ 4, 5, 6 });
l1.splice(l1.end(), l2);
std::list l1({1,2,3});
列表l2({4,5,6});
l1.拼接(l1.end(),l2);
对于
std::list
有一个
splice()
,可用于将节点从一个列表传输到另一个列表。遗憾的是,当使用两个迭代器和两个
std:list
对象之间的
splice()
ing指定一个范围时,这种方法在拼接序列的长度上被破坏成线性。此更改有利于使用恒定时间
size()
操作

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


“std::list是一个容器,它支持从容器中的任何位置固定时间插入和移除元素。”--您确定列表会自动排序吗?“通过将x的所有元素在其各自的已排序位置转移到容器中,将x合并到列表中(两个容器都应已排序)。”@AlexisWilke
std::list::merge
处理已排序的列表并生成已排序的列表“std::list是一个容器,它支持在容器中的任何位置以固定时间插入和删除元素。”--您确定列表会自动排序吗?“@AlexisWilke
std::list::merge
处理已排序的列表并生成已排序的列表注意,这是一个
O(n)
操作,而不是
O(1)操作。”
注意,尽管这是一个
O(n)
操作,而不是
O(1)
破坏性
拼接
s这样的时间是恒定的,根据规范中的23.3.6.5……我想知道列表如何知道它插入O(1)的范围内的元素数量当范围来自同一列表时。@chrisdd:Fair point:
splice()
仅在两个不同列表之间使用迭代器分隔的范围的有趣情况下是线性的。@MartinDrozdik:when
splice()
int在同一列表中时,无需更新
size()
:由于节点被传输,
size()
不会改变。@MartinDrozdik:它从
size()中知道源列表的
,因为它正在将整个源列表拼接到目标列表中。根据规范中的23.3.6.5,像这样的破坏性的拼接是恒定时间。我想知道列表如何知道它在O(1)中插入的范围内的元素数当范围来自同一列表时。@chrisdd:Fair point:
splice()
仅在两个不同列表之间使用迭代器分隔的范围的有趣情况下是线性的。@MartinDrozdik:when
splice()
int在同一列表中时,无需更新
size()
:由于节点被传输,
size()
不会改变。@MartinDrozdik:它从源列表的
size()
中知道,因为它正在将整个源列表拼接到目标列表中。