赞
踩
看到《C++标准库第2版》对list::merge()的相关介绍,令我有点迷糊,特意敲代码验了一下不同情况的调用结果。
merge()的作用就是将两个list合并在一起,函数有2个版本:
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c1.sort(); //默认升序排序
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后没有按c1的默认升序排序
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c2.sort(); //默认升序排序
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后没有按c2的默认升序排序
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c1.sort(); //默认升序排序
- c2.sort(); //默认升序排序
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后也能按默认升序排序
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c1.sort(); //默认升序排序
- c2 = c1;
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:可以看到,c1赋值给c2,使得c2也具有了与c1一样的默认排序,两者合并后,仍能按默认升序排序,结果与情况三结果相似。
下面使用自定义的降序规则(op())来排序
- //降序比较
- auto op = [](int first, int second) {
- return first > second;
- };
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c1.sort(op);
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后没有按c1的自定义降序排序,与情况一相似
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c2.sort(op);
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后没有按c2的自定义降序排序,与情况二相似
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c1.sort(op);
- c2.sort(op);
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后,其结果仅仅是将c2放到了c1的末端,c1段、c2段数据仍是合并前的顺序,这与情况三有差异
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c1.sort(op);
- c2.sort();
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后,没有按c1的自定义降序排序,也没有按c2的默认排序,与情况二相似
- list<int> c1{ 0,1,2,88,3,4 };
- list<int> c2{ 10,11,99,13,14,15 };
- cout << "-----------原始数据-----------" << endl;
- myPrinter(c1, c2);
-
- cout << "-----------排序后数据-----------" << endl;
- c1.sort(op);
- c2 = c1;
- myPrinter(c1, c2);
-
- cout << "-----------合并后数据-----------" << endl;
- c1.merge(c2);
- myPrinter(c1, c2);
结果:合并后,其结果仅仅是将c2放到了c1的末端,c1段、c2段数据仍是合并前的顺序,这与情况七相同,但与情况三有差异
因为合并后的顺序情况多变,所以如果希望合并后结果按某种规则排序,建议使用c1.merge(c2, op),指明合并后的排序规则。
当然,如果c1,c2都是默认排序,则可以直接使用c1.merge(c2),即上文提到的情况三。
- template <class T>
- void printfList(const T& _Container, const char* _Delim)
- {
- std::copy(_Container.cbegin(), _Container.cend(), std::ostream_iterator<T::value_type>(cout, _Delim));
- cout << endl;
- }
-
- void myPrinter(const list<int>& c1, const list<int>& c2)
- {
- cout << "c1:";
- printfList(c1, " ");
- cout << "c2:";
- printfList(c2, " ");
- cout << "----------------------" << endl << endl;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。