












arg...指的是元素构造函数的参数(0~N个)
- #include
- #include
- #include
- #include
- using namespace std;
-
- class aaa
- {
- public:
- aaa() {
- c = 666;
- };
- aaa(int a, int b) {
- c = a + b;
- };
- friend std::ostream& operator << (std::ostream& o, const aaa& s) {
- o << s.c;
- return o;
- }
-
- private:
- int c;
- };
-
- int main()
- {
- forward_list
t1{ {1,1},{},{2,2} }; - std::copy(t1.cbegin(), t1.cend(), std::ostream_iterator
(cout, " ")); - cout << endl;
-
- t1.emplace_after(t1.before_begin(), 6, 8);
- std::copy(t1.cbegin(), t1.cend(), std::ostream_iterator
(cout, " ")); - cout << endl;
-
- t1.emplace_after(t1.before_begin());
- std::copy(t1.cbegin(), t1.cend(), std::ostream_iterator
(cout, " ")); - cout << endl;
-
- forward_list<int> t{ 1,2,3 };
- t.emplace_after(t.before_begin(), 55);
- std::copy(t.cbegin(), t.cend(), std::ostream_iterator<int>(cout, "-"));
- for (;;);
- }


这个调用的参数顺序与函数定义的参数顺序并不一致,于是我专门验证了一下,发现这个写法的运行结果与按照函数定义的参数顺序t2.splice_after(pos2, t1, pos1);运行结果居然相同,甚至我改成了下面这样的调用,结果仍然相同
- forward_list<int> t3; //定义一个空的forward_list
- t3.splice_after(pos2, forward_list<int>(), pos1); //形参传入一个空的forward_list

细看了一下 splice_after函数实现发现,在没有开启DEBUG宏的情况下,其内部并没有操作形参传入的forward_list参数,而只是对迭代器pos2、pos1之右(后)所指内容进行了拼接。即常规的单向链表拼接的指针操作。


示例代码:
- #include
- #include
- using namespace std;
-
- int main()
- {
- forward_list<int> t1{1,2,3,4,5};
- forward_list<int> t2{ 97,98,99};
- auto pos1 = t1.before_begin();
- for (auto pb1 = t1.begin(); pb1 != t1.end(); ++pb1,++pos1)
- {
- if (*pb1 == 3)
- {
- break;
- }
- }
-
- auto pos2 = t2.before_begin();
- for (auto pb2 = t2.begin(); pb2 != t2.end(); ++pb2, ++pos2)
- {
- if (*pb2 == 99)
- {
- break;
- }
- }
-
- t1.splice_after(pos2, t2, pos1);
- //t2.splice_after(pos2, t1, pos1);
- //forward_list
t3; - //t3.splice_after(pos2, forward_list
(), pos1); -
-
- //t2.splice_after(pos2, t1, t1.before_begin());
- //t2.splice_after(pos2, t1, t1.begin());
- for (;;);
- }