あるリストから別のリストへの範囲のスプライシングは、size()
の複雑さを線形にすることを犠牲にして、一定の時間で達成できます。
C++11 では、一定時間であるstd::list
必要がある場合に変更されました。size()
これにより、たとえば gcc の実装が壊れました。[C++0x] std::list::size complexを参照してください。
range 以外splice()
に、以前の C++03 準拠の実装で一定時間にできなかった他の理由はありますか? size()
std::list
リスト全体または範囲を線形に接合するのはなぜ std::forward_list
ですか?
splice_after()
、ケース (1) および (3)を参照してください。標準ドラフト N3485の 23.3.4.6 forward_list 操作 [forwardlist.ops] も参照してください。も実装していstd::forward_list
ませんsize()
。
splice_after()
forward_list が単独でリンクされたリストであることは知っていますが、一定の時間で範囲を実行できない理由がわかりません。私はおそらくここで些細なことを見逃しています...
編集: OK、少なくとも部分的には私の誤解でした。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