剪接的范围从一个列表到另一个可在恒定的时间来完成,在制备为代价size()
的复杂度是线性的。
C ++ 11已经改变,在箱子std::list
通过要求size()
为恒定时间。 这打破了,例如,GCC的实现,请参阅[C ++ 0x中]的std ::目录::大小的复杂性 。
除了范围splice()
是有原因的任何其他原因 size()
不能在早期,C ++ 03符合进行一定时间 std::list
实现?
为什么拼接整个列表或一个线性范围 std::forward_list
?
见splice_after()
箱子(1)和(3)。 看到也23.3.4.6修饰符Modifiers操作[forwardlist.ops] N3485标准草案 。 该std::forward_list
甚至不执行size()
我知道修饰符Modifiers是一个单向链表,但我不明白为什么人们不能做的范围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