开发者

C++ std::list的merge()使用方式与分析

目录
  • 《C++标准库第2版》对list::merge()的相关介绍
  • list::merge()定义
  • c1.merge(c2)调用情况分析
    • 情况一:c1默认排序,c2不排序,c2合入c1中
    • 情况二:c1不排序,c2默认排序,c2合入c1中
    • 情况三:c1默认排序,c2默认排序,c2合入c1中
    • 情况四:c1默认排序,将c1赋值给c2,c2合入c1中
    • 情况五:c1自定义降序排序,c2不排序,c2合入c1中
    • 情况六:c1不排序,c2自定义降序排序,c2合入c1中
    • 情况七编程:c1自定义降序排序,c2自定义降序排序,c2合入c1中
    • 情况八:c1自定义降序排序,c2默认排序,c2合入c1中
    • 情况九:c1自定义降序排序,将c1赋值给c2,c2合入c1中
  • 结论

    看到《C++标准库第2版》对list::merge()的相关介绍,令我有点迷糊,特意敲代码验了一下不同情况的调用结果。

    《C++标准库第2版》对list::merge()的相关介绍

    C++ std::list的merge()使用方式与分析

    C++ std::list的merge()使用方式与分析

    list::merge()定义

    merge()的作用就是将两个list合并在一起,函数有2个版本:

    c1.merge(c2)------------->这个版本含糊,将c2合入c1中,但合并后元素是怎么排序的呢?下文主要分析这个版本的不同调用结果

    c1.merge(c2, op)--------->这个版本比较简单,就是将c2的内容合入到c1中,然后按op()排序

    c1.merge(c2)调用情况分析

    前提:有两个list,内容分别如下:

    C++ std::list的merge()使用方式与分析

    情况一:c1默认排序,c2不排序,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;
    	c1.sort(); //默认升序排序
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:合并后没有按c1的默认升序排序

    情况二:c1不排序,c2默认排序,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 << "-----------排序后数据------php-----" << endl;
    	c2.sort(); //默认升序排序
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:合并后没有按c2的默认升序排序

    情况三:c1默认排序,c2默认排序,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;
    	c1.sort(); //默认升序排序
    	c2.sort(); //默认升序排序
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:合并后也能按默认升序排序

    情况四:c1默认排序,将c1赋值给c2,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;
    	c1.sort(); //默认升序排序
    	c2 = c1;
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:可以看到,c1赋值给c2,使得c2也具有了与c1一样的默认排序,两者合并后,仍能按默认升序排序,结果与情况三结果相似。

    下面使用自定义的降序规则(op())来排序

        //降序比较
    	auto op = [](int first, int second) {
    		return first > second;
    	};

    情况五:c1自定义降序排序,c2不排序,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;
    	c1.sort(op);
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:合并后没有按c1的自定义降序排序,与情况一相似

    情况六:c1不排序,c2自定义降序排序,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 << "-----------合并编程客栈后数据-----------" http://www.devze.com<< endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:合并后没有按c2的自定义降序排序,与情况二相似

    情况七:c1自定义降序排序,c2自定义降序排序,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;
    	c1.sort(op);
    	c2.sort(op);
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:合并后,其结果仅仅是将c2放到了c1的末端,c1段、c2段数据仍是合并前的顺序,这与情况三有差异

    情况八:c1自定义降序排序,c2默认排序,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;
    	c1.sort(op);
    	c2.sort();
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

    C++ std::list的merge()使用方式与分析

    结果:合并后,没有按c1的自定义降序排序,也没有按c2的默认排序,与情况二相似

    情况九:c1自定义降序排序,将c1赋值给c2,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;
    	c1.sort(op);
    	c2 = c1;
    	myPrinter(c1, c2);
     
    	cout << "-----------合并后数据-----------" << endl;
    	c1.merge(c2);
    	myPrinter(c1, c2);

     

    C++ std::list的merge()使用方式与分析

    结果:合并后,其结果仅仅是将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 << "--------------------python--" << endl << endl;
    }

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜