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

常用的STL查找算法

 更新時(shí)間:2015年07月01日 09:53:54   投稿:hebedich  
這篇文章主要介紹了常用的STL查找算法的相關(guān)資料,十分的詳細(xì),需要的朋友可以參考下

《effective STL》中有句忠告,盡量用算法替代手寫循環(huán);查找少不了循環(huán)遍歷,在這里總結(jié)下常用的STL查找算法;

查找有三種,即點(diǎn)線面:
點(diǎn)就是查找目標(biāo)為單個(gè)元素;
線就是查找目標(biāo)為區(qū)間;
面就是查找目標(biāo)為集合;

針對(duì)每個(gè)類別的查找,默認(rèn)的比較函數(shù)是相等,為了滿足更豐富的需求,算法也都提供了自定義比較函數(shù)的版本;

單個(gè)元素查找

find() 比較條件為相等的查找

find()從給定區(qū)間中查找單個(gè)元素,定義:

復(fù)制代碼 代碼如下:

template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);

示例,從myvector中查找30:

復(fù)制代碼 代碼如下:

int myints[] = { 10, 20, 30, 40 };
std::vector<int> myvector (myints,myints+4);
it = find (myvector.begin(), myvector.end(), 30);
if (it != myvector.end())
    std::cout << "Element found in myvector: " << *it << '\n';
else
    std::cout << "Element not found in myvector\n";

find_if() 自定義比較函數(shù)

std::find_if():從給定區(qū)間中找出滿足比較函數(shù)的第一個(gè)元素;
示例,從myvector中查找能夠被30整除的第一個(gè)元素:

復(fù)制代碼 代碼如下:

bool cmpFunction (int i) {
  return ((i%30)==0);
}
it = std::find_if (myvector.begin(), myvector.end(), cmpFunction);
std::cout << "first:" <<  *it <<std::endl;

count() 統(tǒng)計(jì)元素出現(xiàn)次數(shù)

std::count():統(tǒng)計(jì)區(qū)間中某個(gè)元素出現(xiàn)的次數(shù);
std:count_if():count()的自定義比較函數(shù)版本

search_n() 查詢單個(gè)元素重復(fù)出現(xiàn)的位置

search_n(): find用來(lái)查詢單個(gè)元素,search_n則用來(lái)查找區(qū)間中重復(fù)出現(xiàn)n次的元素;

示例:查詢myvector中30連續(xù)出現(xiàn)2次的位置:

復(fù)制代碼 代碼如下:

int myints[]={10,20,30,30,20,10,10,20};
std::vector<int> myvector (myints,myints+8);
it = std::search_n (myvector.begin(), myvector.end(), 2, 30);

search_n() 支持自定義比較函數(shù);

adjacent_find() 查詢區(qū)間中重復(fù)元素出現(xiàn)的位置

adjacent_find() 查詢區(qū)間中重復(fù)元素出現(xiàn)的位置,該算法支持自定義比較函數(shù);

lower_bound() 有序區(qū)間中查詢?cè)剡吔?/p>

lower_bound()用來(lái)在一個(gè)排序的區(qū)間中查找第一個(gè)不小于給定元素的值:
示例:查找容器v中不小于20的下界:

復(fù)制代碼 代碼如下:

int myints[] = {10,20,30,30,20,10,10,20};
std::vector<int> v(myints,myints+8);           // 10 20 30 30 20 10 10 20
std::sort (v.begin(), v.end());                // 10 10 10 20 20 20 30 30
std::vector<int>::iterator low,up;
low=std::lower_bound (v.begin(), v.end(), 20);
std::cout << "lower_bound at position " << (low- v.begin()) << '\n';

類似算法有upper_bound(),查找有序區(qū)間中第一個(gè)大于給定元素的值;
還有equal_range(),查找有序區(qū)間的上下邊界;(一次返回lower_bound()和upper_bound());

binary_search() 有序區(qū)間的二分查找

binary_search() 用來(lái)在一個(gè)有序區(qū)間中使用二分法查找元素是否在這個(gè)區(qū)間中,注,這個(gè)算法的返回值為bool,
不是下標(biāo)位置,其內(nèi)部的算法邏輯和lower_bound()相似,行為表現(xiàn)為:

復(fù)制代碼 代碼如下:

template <class ForwardIterator, class T>
  bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
  first = std::lower_bound(first,last,val);
  return (first!=last && !(val<*first));
}

示例:從有序區(qū)間v中找3是否存在:

復(fù)制代碼 代碼如下:

int myints[] = {1,2,3,4,5,4,3,2,1};
std::vector<int> v(myints,myints+9);                         // 1 2 3 4 5 4 3 2 1
std::sort (v.begin(), v.end());
if (std::binary_search (v.begin(), v.end(), 3))
    std::cout << "found!\n"; else std::cout << "not found.\n";

min_element() 查找最小元素

min_element() 在給定區(qū)間中查找出最小值;

復(fù)制代碼 代碼如下:

int myints[] = {3,7,2,5,6,4,9};
std::cout << "The smallest element is " << *std::min_element(myints,myints+7) << '\n';

類似算法有:max_element() 查找最大值;

區(qū)間查找 search()

search() 查找子區(qū)間首次出現(xiàn)的位置

find()用來(lái)查找單個(gè)元素,search()則用來(lái)查找一個(gè)子區(qū)間;
示例:從myvector中查找出現(xiàn)子區(qū)間[20,30]的位置:

復(fù)制代碼 代碼如下:

  int needle1[] = {20,30};
  it = std::search (myvector.begin(), myvector.end(), needle1, needle1+2);
  if (it!=myvector.end())
    std::cout << "needle1 found at position " << (it-myvector.begin()) << '\n';

search支持自定義比較函數(shù);
示例:查詢給定區(qū)間中每個(gè)元素比目標(biāo)區(qū)間小1的子區(qū)間;

復(fù)制代碼 代碼如下:

bool cmpFunction (int i, int j) {
  return (i-j==1);
}
int myints[] = {1,2,3,4,5,1,2,3,4,5};
std::vector<int> haystack (myints,myints+10);
int needle2[] = {1,2,3};
// using predicate comparison:
it = std::search (haystack.begin(), haystack.end(), needle2, needle2+3, cmpFunction);

find_end() 查找子區(qū)間最后一次出現(xiàn)的位置

search() 用來(lái)查找子區(qū)間第一次出現(xiàn)的位置,而find_end()用來(lái)查找子區(qū)間最后一次出現(xiàn)的位置:
find_end()支持自定義比較函數(shù);

equal() 判斷兩個(gè)區(qū)間是否相等

equal()用來(lái)判斷兩個(gè)區(qū)間是否相等,該算法支持自定義比較函數(shù);

mismatch() 查詢兩個(gè)區(qū)間首次出現(xiàn)不同的位置;

mismatch() 查詢兩個(gè)區(qū)間首先出現(xiàn)不同的位置,這個(gè)算法也支持自定義比較函數(shù);

集合查找

find_first_of 查找集合中的任意一個(gè)元素

find_first_of()用來(lái)查找給定集合中的任意一個(gè)元素:
示例:從haystack中查找A,B,C出現(xiàn)的位置:

復(fù)制代碼 代碼如下:

  int mychars[] = {'a','b','c','A','B','C'};
  std::vector<char> haystack (mychars,mychars+6);
  int needle[] = {'C','B','A'};
  // using default comparison:
  it = find_first_of (haystack.begin(), haystack.end(), needle, needle+3);

find_first_of支持自定義比較函數(shù);

以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。

相關(guān)文章

  • C語(yǔ)言如何實(shí)現(xiàn)翻轉(zhuǎn)字符串中的單詞

    C語(yǔ)言如何實(shí)現(xiàn)翻轉(zhuǎn)字符串中的單詞

    這篇文章主要介紹了C語(yǔ)言如何實(shí)現(xiàn)翻轉(zhuǎn)字符串中的單詞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Linux下編譯C程序的過(guò)程

    Linux下編譯C程序的過(guò)程

    我們總是在Linux下輸入 gcc -o app main.c 即可編譯好程序,對(duì)于具體的詳細(xì)過(guò)程及流程,相信親們就不太了解啦!下面給大家展示一下C編譯器的解釋全過(guò)程。
    2016-01-01
  • C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)

    C++深入分析數(shù)據(jù)在內(nèi)存中的存儲(chǔ)形態(tài)

    使用編程語(yǔ)言進(jìn)行編程時(shí),需要用到各種變量來(lái)存儲(chǔ)各種信息。變量保留的是它所存儲(chǔ)的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會(huì)在內(nèi)存中保留一些空間。您可能需要存儲(chǔ)各種數(shù)據(jù)類型的信息,操作系統(tǒng)會(huì)根據(jù)變量的數(shù)據(jù)類型,來(lái)分配內(nèi)存和決定在保留內(nèi)存中存儲(chǔ)什么
    2023-01-01
  • C++線程之thread詳解

    C++線程之thread詳解

    這篇文章主要為大家詳細(xì)介紹了C++線程中的thread,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字

    用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字

    這篇文章主要為大家詳細(xì)介紹了用C語(yǔ)言實(shí)現(xiàn)猜數(shù)字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C BlowFish對(duì)稱加密算法詳解

    C BlowFish對(duì)稱加密算法詳解

    這篇文章主要介紹了C BlowFish對(duì)稱加密算法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解

    C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解

    這篇文章主要介紹了C++中構(gòu)造函數(shù)的參數(shù)缺省的詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • C++實(shí)現(xiàn)LeetCode(134.加油站問(wèn)題)

    C++實(shí)現(xiàn)LeetCode(134.加油站問(wèn)題)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(134.加油站問(wèn)題),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++數(shù)組的定義詳情

    C++數(shù)組的定義詳情

    這篇文章主要介紹了C++數(shù)組的定義詳情,上一篇文章我們學(xué)習(xí)了類型,接下倆我們九在類型的基礎(chǔ)上展開(kāi)本篇內(nèi)容數(shù)組的常用方法以及C++標(biāo)準(zhǔn)庫(kù)提供的一些關(guān)于數(shù)組的容器,需要的朋友可以參考一下,希望對(duì)你有所幫助
    2021-12-12
  • C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘

    C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)基于控制臺(tái)的電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

缙云县| 叶城县| 阿拉尔市| 大荔县| 金门县| 南昌县| 锦屏县| 合肥市| 顺平县| 琼结县| 右玉县| 崇义县| 巩留县| 长垣县| 晴隆县| 卢龙县| 新邵县| 云阳县| 饶平县| 枞阳县| 大宁县| 长沙市| 尉犁县| 扎囊县| 大足县| 缙云县| 宣化县| 迭部县| 武胜县| 沾化县| 本溪市| 昭苏县| 叙永县| 游戏| 绥棱县| 塘沽区| 晴隆县| 孟津县| 昔阳县| 谢通门县| 长沙市|