最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2024年04月23日 10:35:00   作者:Jane_Yih  
這篇文章主要介紹了C++ std::list的merge()使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

看到《C++標(biāo)準(zhǔn)庫第2版》對(duì)list::merge()的相關(guān)介紹,令我有點(diǎn)迷糊,特意敲代碼驗(yàn)了一下不同情況的調(diào)用結(jié)果。

《C++標(biāo)準(zhǔn)庫第2版》對(duì)list::merge()的相關(guān)介紹

list::merge()定義

merge()的作用就是將兩個(gè)list合并在一起,函數(shù)有2個(gè)版本:

c1.merge(c2)------------->這個(gè)版本含糊,將c2合入c1中,但合并后元素是怎么排序的呢?下文主要分析這個(gè)版本的不同調(diào)用結(jié)果

c1.merge(c2, op)--------->這個(gè)版本比較簡單,就是將c2的內(nèi)容合入到c1中,然后按op()排序

c1.merge(c2)調(diào)用情況分析

前提:有兩個(gè)list,內(nèi)容分別如下:

情況一:c1默認(rèn)排序,c2不排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c1.sort(); //默認(rèn)升序排序
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:合并后沒有按c1的默認(rèn)升序排序

情況二:c1不排序,c2默認(rèn)排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c2.sort(); //默認(rèn)升序排序
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:合并后沒有按c2的默認(rèn)升序排序

情況三:c1默認(rèn)排序,c2默認(rèn)排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c1.sort(); //默認(rèn)升序排序
	c2.sort(); //默認(rèn)升序排序
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:合并后也能按默認(rèn)升序排序

情況四:c1默認(rèn)排序,將c1賦值給c2,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c1.sort(); //默認(rèn)升序排序
	c2 = c1;
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:可以看到,c1賦值給c2,使得c2也具有了與c1一樣的默認(rèn)排序,兩者合并后,仍能按默認(rèn)升序排序,結(jié)果與情況三結(jié)果相似。

下面使用自定義的降序規(guī)則(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 << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c1.sort(op);
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:合并后沒有按c1的自定義降序排序,與情況一相似

情況六:c1不排序,c2自定義降序排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c2.sort(op);
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:合并后沒有按c2的自定義降序排序,與情況二相似

情況七:c1自定義降序排序,c2自定義降序排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c1.sort(op);
	c2.sort(op);
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:合并后,其結(jié)果僅僅是將c2放到了c1的末端,c1段、c2段數(shù)據(jù)仍是合并前的順序,這與情況三有差異

情況八:c1自定義降序排序,c2默認(rèn)排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c1.sort(op);
	c2.sort();
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

結(jié)果:合并后,沒有按c1的自定義降序排序,也沒有按c2的默認(rèn)排序,與情況二相似

情況九:c1自定義降序排序,將c1賦值給c2,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };
	list<int> c2{ 10,11,99,13,14,15 };
	cout << "-----------原始數(shù)據(jù)-----------" << endl;
	myPrinter(c1, c2);
 
	cout << "-----------排序后數(shù)據(jù)-----------" << endl;
	c1.sort(op);
	c2 = c1;
	myPrinter(c1, c2);
 
	cout << "-----------合并后數(shù)據(jù)-----------" << endl;
	c1.merge(c2);
	myPrinter(c1, c2);

 

結(jié)果:合并后,其結(jié)果僅僅是將c2放到了c1的末端,c1段、c2段數(shù)據(jù)仍是合并前的順序,這與情況七相同,但與情況三有差異

結(jié)論

因?yàn)楹喜⒑蟮捻樞蚯闆r多變,所以如果希望合并后結(jié)果按某種規(guī)則排序,建議使用c1.merge(c2, op),指明合并后的排序規(guī)則。

當(dāng)然,如果c1,c2都是默認(rèn)排序,則可以直接使用c1.merge(c2),即上文提到的情況三。

附:示例的輔助函數(shù)

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;
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言新手初階教程之三子棋實(shí)現(xiàn)

    C語言新手初階教程之三子棋實(shí)現(xiàn)

    相信大家在小時(shí)候都用紙和筆與小伙伴們玩過一個(gè)經(jīng)典的游戲之井字棋,即三子棋,下面這篇文章主要給大家介紹了關(guān)于C語言新手初階教程之三子棋實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • C/C++中OpenCV 矩陣運(yùn)算的實(shí)現(xiàn)

    C/C++中OpenCV 矩陣運(yùn)算的實(shí)現(xiàn)

    本文主要介紹了C/C++中OpenCV 矩陣運(yùn)算的實(shí)現(xiàn),包括基本算術(shù)運(yùn)算(標(biāo)量與矩陣)、矩陣乘法、轉(zhuǎn)置、逆矩陣、行列式、跡、范數(shù)等操作,感興趣的可以了解一下
    2025-05-05
  • 詳解C語言之文件操作(上)

    詳解C語言之文件操作(上)

    這篇文章主要介紹了關(guān)于C語言文件操作方法的相關(guān)資料,小編覺得這篇文章寫的還不錯(cuò),需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • Matlab實(shí)現(xiàn)將圖像序列合并為視頻的方法詳解

    Matlab實(shí)現(xiàn)將圖像序列合并為視頻的方法詳解

    MATLAB是一種高性能語言,用于操縱矩陣、執(zhí)行技術(shù)計(jì)算、繪圖等。它代表矩陣實(shí)驗(yàn)室。借助這個(gè)軟件,我們可以從圖像中創(chuàng)建視頻。這篇文章主要介紹了Matlab實(shí)現(xiàn)將圖像序列合并為視頻的四個(gè)方法,希望對(duì)大家有所幫助
    2023-03-03
  • 從入門到精通C++11?<chrono>?庫特性

    從入門到精通C++11?<chrono>?庫特性

    chrono庫是C++11中一個(gè)非常強(qiáng)大和實(shí)用的庫,它為時(shí)間處理提供了豐富的功能和類型安全的接口,通過本文的介紹,我們了解了chrono庫的基本概念,感興趣的朋友一起看看吧
    2025-06-06
  • Linux下C語言的幾道經(jīng)典面試題小結(jié)(分享)

    Linux下C語言的幾道經(jīng)典面試題小結(jié)(分享)

    下面小編就為大家?guī)硪黄狶inux下C語言的幾道經(jīng)典面試題小結(jié)(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • C++超詳細(xì)講解引用和指針

    C++超詳細(xì)講解引用和指針

    引用是C++一個(gè)很重要的特性,顧名思義是某一個(gè)變量或?qū)ο蟮膭e名,對(duì)引用的操作與對(duì)其所綁定的變量或?qū)ο蟮牟僮魍耆葍r(jià),這篇文章主要給大家總結(jié)介紹了C++中引用的相關(guān)知識(shí)點(diǎn),需要的朋友可以參考下
    2022-06-06
  • C++的類型轉(zhuǎn)換(強(qiáng)轉(zhuǎn))你了解嗎

    C++的類型轉(zhuǎn)換(強(qiáng)轉(zhuǎn))你了解嗎

    這篇文章主要為大家詳細(xì)介紹了C++的類型轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • c語言中用字符串?dāng)?shù)組顯示菜單的解決方法

    c語言中用字符串?dāng)?shù)組顯示菜單的解決方法

    本篇文章是對(duì)c語言中用字符串?dāng)?shù)組顯示菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言 數(shù)據(jù)類型詳細(xì)介紹

    C語言 數(shù)據(jù)類型詳細(xì)介紹

    本文主要講解C語言 數(shù)據(jù)類型,這里整理了詳細(xì)的數(shù)據(jù)類型的資料,希望能幫助剛剛開始學(xué)習(xí)C語言的同學(xué)
    2016-08-08

最新評(píng)論

贵定县| 北流市| 昔阳县| 正阳县| 汝城县| 漾濞| 灌云县| 广饶县| 会同县| 商城县| 新昌县| 禄劝| 南涧| 阿坝县| 永泰县| 平山县| 平塘县| 当涂县| 大石桥市| 永和县| 西宁市| 剑川县| 苏尼特左旗| 进贤县| 阿巴嘎旗| 岢岚县| 忻城县| 曲周县| 津市市| 维西| 湖州市| 合水县| 铁岭县| 炎陵县| 康马县| 郎溪县| 红原县| 定西市| 阿鲁科尔沁旗| 视频| 樟树市|