为什么我们在拼接函数cpp中需要一个列表参数?为什么仅迭代器是不够的?如果我将l1
或l2
作为第二个参数传递,结果是相同的l1.splice(st, l1, it, it2);
或l1.splice(st, l2, it, it2);
打印1 4 5 2 3
#include <bits/stdc++.h>
using namespace std;
int main()
{
// initializing lists and iterator
list<int> l1 = { 1, 2, 3 };
list<int> l2 = { 4, 5 };
auto it = l2.begin();
auto it2 = l2.end();
auto st = l1.begin();
std::advance(st,1);
// result the same if in splice l1 or l2
// 1 4 5 2 3
l1.splice(st, l2, it, it2);
cout << "list l1 after splice operation" << endl;
for (auto x : l1)
cout << x << " ";
return 0;
}
此电话
l1.splice(st, l1, it, it2);
调用未定义的行为。
[当您需要提取一系列元素时,必须更新列表的其他数据成员,例如size
。
例如,如果要执行此语句,则>]
std::cout << l2.size() << '\n';
您会得到意想不到的结果。
这里是一个用gcc 8.3编译的演示程序。
#include <iostream> #include <list> #include <iterator> int main() { std::list<int> lst1 = { 1, 3, 5, 7, 9 }; std::list<int> lst2 = { 0, 2, 4, 6, 8 }; lst1.splice( std::next( std::begin( lst1 ) ), lst1, std::begin( lst2 ), std::end( lst2 ) ); for ( const auto &item : lst1 ) { std::cout << item << ' '; } std::cout << '\n'; for ( const auto &item : lst2 ) { std::cout << item << ' '; } std::cout << '\n'; std::cout << "the size of lst2 is " << lst2.size() << '\n'; return 0; }
其输出为
1 0 2 4 6 8 3 5 7 9 the size of lst2 is 5
如果您在此通话中将
lst1
更改为lst2
lst1.splice( std::next( std::begin( lst1 ) ), lst2, // <=== std::begin( lst2 ), std::end( lst2 ) );
然后您将获得正确的输出
1 0 2 4 6 8 3 5 7 9
the size of lst2 is 0
^^^