怎么把网站扒下来,莱芜58同城网,网站建设要与安全防护同步规划,莆田网站建设哪里便宜看到《C标准库第2版》对list::merge()的相关介绍#xff0c;令我有点迷糊#xff0c;特意敲代码验了一下不同情况的调用结果。
《C标准库第2版》对list::merge()的相关介绍 list::merge()定义
merge()的作用就是将两个list合并在一起#xff0c;函数有2个版本#xff1a;…看到《C标准库第2版》对list::merge()的相关介绍令我有点迷糊特意敲代码验了一下不同情况的调用结果。
《C标准库第2版》对list::merge()的相关介绍 list::merge()定义
merge()的作用就是将两个list合并在一起函数有2个版本
c1.merge(c2)-------------这个版本含糊将c2合入c1中但合并后元素是怎么排序的呢下文主要分析这个版本的不同调用结果c1.merge(c2, op)---------这个版本比较简单就是将c2的内容合入到c1中然后按op()排序
c1.merge(c2)调用情况分析
前提有两个list内容分别如下 情况一c1默认排序c2不排序c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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的默认升序排序 情况二c1不排序c2默认排序c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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的默认升序排序 情况三c1默认排序c2默认排序c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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); 结果合并后也能按默认升序排序 情况四c1默认排序将c1赋值给c2c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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;};
情况五c1自定义降序排序c2不排序c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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的自定义降序排序与情况一相似
情况六c1不排序c2自定义降序排序c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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的自定义降序排序与情况二相似
情况七c1自定义降序排序c2自定义降序排序c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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段数据仍是合并前的顺序这与情况三有差异 情况八c1自定义降序排序c2默认排序c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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的默认排序与情况二相似
情况九c1自定义降序排序将c1赋值给c2c2合入c1中 listint c1{ 0,1,2,88,3,4 };listint 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_iteratorT::value_type(cout, _Delim));cout endl;
}void myPrinter(const listint c1, const listint c2)
{cout c1;printfList(c1, );cout c2;printfList(c2, );cout ---------------------- endl endl;
}