可以在恒定时间内完成从一个列表到另一个列表的拼接,但代价是使size()
' 的复杂性呈线性。
C++11std::list
通过要求size()
恒定时间改变了这一点。例如,这破坏了 gcc 的实现,请参阅[C++0x] std::list::size complex。
除了 range 之外splice()
,还有什么其他原因 size()
不能在早期的符合 C++03 的 std::list
实现中设为恒定时间吗?
为什么拼接整个列表或范围是线性的 std::forward_list
?
参见splice_after()
案例 (1) 和 (3)。另见标准草案 N3485中的 23.3.4.6 forward_list 操作 [forwardlist.ops] 。std::forward_list
甚至没有size()
实现。
我知道 forward_list 是一个单链表,但我不明白为什么不能splice_after()
在恒定时间内完成该范围。我可能在这里遗漏了一些微不足道的东西......
编辑:好的,至少部分是我的误解,我预计 4不会保留在源列表中。代码:
#include <algorithm>
#include <iostream>
#include <forward_list>
using namespace std;
void dump_list(const forward_list<char>& l) {
for(char c : l)
cout << c << ' ';
cout << '\n';
}
int main()
{
forward_list<char> trg = {'a','b','c'};
forward_list<char> src = {'1','2','3','4'};
auto first = src.begin();
auto last = find(src.begin(), src.end(), '4');
cout << "first = " << *first << ", last = " << *last << "\n\n";
trg.splice_after(trg.begin(), src, first, last);
cout << "Target after splice:\n";
dump_list(trg);
cout << "Source after splice:\n";
dump_list(src);
cout << endl;
return 0;
}
输出:
first = 1, last = 4
Target after splice:
a 2 3 b c
Source after splice:
1 4