标准库<algorithm>里find系列函数

使用一个东西,不明白它的道理,不高明
——侯捷老师

1. find()函数

在指定序列的范围内查找指定值

1.1 函数声明

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

1.2 等价操作实现

template<class InputIterator, class T>
  InputIterator find(InputIterator first, InputIterator last, const T& val) {
  while (first != last) {
    if (*first == val) return first;
    ++first;
  }
return last
}

1.3 参数详解

  • first, last

输入迭代器,区间表示[first, last)

  • val

查找的值

1.4 返回值

返回输入序列中第一个出现val的位置的迭代器,如果没有找到,则返回last

1.5 示例程式

test_find() {
        
        // using find with array and pointer
        int arr[] = {10, 20, 30, 40, 50};
        int *p;
        p = std::find(arr, arr+4, 30);
        if (p != arr+4) {
            cout << "Element found is arr: " << "*p = " << *p << endl;
        } else {
            cout << "Element not found in arr: " << "*p = " << *p << endl;
        }
        
        // using std::find with vector and iterator
        vector<int> vec(arr, arr+4);
        vector<int>::iterator it;
        it = std::find(vec.begin(), vec.end(), 60);
        if (it != vec.end()) {
            cout << "Element found is arr: " << "*it = " << *it << endl;
        } else {
            cout << "Element not found" << "*it = " << *it << endl;
        }
    }

1.6 输出结果

image.png

1.7 参考链接

http://www.cplusplus.com/reference/algorithm/find/


2. find_end()函数

在序列1里查找序列2最后出现的位置的起点迭代器

2.1 函数声明

2.1.1 基于传统相等的比较

template<class ForwardIterator1, class ForwardIterator2>
  ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last1,
  ForwardIterator2 first2, ForwardIterator2 last2)

2.1.2 基于自定义谓词的比较

template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
  ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last1,
  ForwardIterator2 first2, ForwardIterator2 last2,
  BinaryPredicate pred)

2.2. 等价操作实现

template<class ForwardIterator1, class ForwardIterator2>
  ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last1,
  ForwardIterator2 first2, ForwardIterator2 last2) {
  if (first2 == last2) return first1;
  ForwardIterator res = last1;
  while (first1 != last1) {
    ForwardIterator1 it1 = first1;
    ForwardIterator2 it2 = first2;
    while (*it1 == *it2) { // or while (pred(*it1, *it2)) for version 2
      ++it1;
      ++it2;
      if (it2 == last2) {
        res = first1;break;
       }
      if (it1 == last1) return res;
    }
    ++first1;
  }
  return res;
}

2.3 参数详解

  • first1, last1

输入序列迭代器,起止为止,区间表示为[first1, last1)

  • first2, last2

同上

  • pred

谓词,二元函数,可以是函数对象或者函数指针

2.4 返回值

en...有时候可能英文解释的更好懂~

An iterator to the first element of the last occurrence of [first2,last2) in [first1,last1).
If the sequence is not found, the function returns last1.
If [first2,last2) is an empty range, the function returns last1.

2.5 示例程式

bool myfunction(int i, int j) {
        return (i == j);
    }
    
    void test_find_end() {
        int myints[] = {1,2,3,4,5,1,2,3,4,5};
        std::vector<int> haystack (myints,myints+10);
        
        int needle1[] = {1,2,3};
    
        // using default comparison:
        std::vector<int>::iterator it;
        it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3);
        
        if (it!=haystack.end())
            std::cout << "needle1 last found at position " << (it-haystack.begin()) << '\n';
        
        int needle2[] = {4,5,1};
        
        // using predicate comparison:
        it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction);
        
        if (it!=haystack.end())
            std::cout << "needle2 last found at position " << (it-haystack.begin()) << '\n';
    }

2.6 输出结果

image.png

2.7 参考链接

http://www.cplusplus.com/reference/algorithm/find_end/


3. find_first_of()函数

功能:在源序列里查找第一个在目标序列里出现的位置

3.1 函数声明

3.1.1 基于传统相等的比较

template<class InputIterator, class ForwardIterator>
  InputIterator find_first_of(InputIterator first1, InputIterator last1, 
                              ForwardIterator first2, ForwardIterator last2)

3.1.2 基于自定义谓词的比较

template<class InputIterator, class ForwardIterator, class BinaryPredicate>
  InputIterator find_first_of(InputIterator first1, InputIterator last1, 
                              ForwardIterator first2, ForwardIterator last2,
                              BinaryPredicate pred)

3.2 等价操作实现

template<class InputIterator, class ForwardIterator>
  InputIterator find_first_of(InputIterator first1, InputIterator last1, 
                              ForwardIterator first2, ForwardIterator last2) {
                                while (first1 != last1) {
                                    for (ForwardIterator it = first2; it != last2; it++) {
                                        if (*first1 == *it) return first1;
                                    }
                                    first1++;
                                }
                                return last1;
                              }

3.3 参数详解

参考3.2

3.4 返回值

返回[first1, last1)里第一个出现在[first2,last2)里元素的迭代器

3.5 示例程式

bool comp_case_insensitive(char c1, char c2) {
        return (std::tolower(c1) == std::tolower(c2));
    }
    
    void test_find_first_of() {
        int chars[] = {'a', 'b', 'c', 'A', 'B','C'};
        vector<char> charvec(chars, chars+6);
        
        vector<char>::iterator it;
        
        char needle[] = {'A', 'B', 'C'};
        
        // using default comparison
        it = find_first_of(charvec.begin(), charvec.end(), needle, needle+3);
        
        if (it != charvec.end()) {
            cout << "The first match is: " << *it << endl;
        }
        
        //using predicate comparison
        it = find_first_of(charvec.begin(), charvec.end(), needle, needle+3, comp_case_insensitive);
        
        if (it != charvec.end()) {
            cout << "The first match is: " << *it << endl;
        }
    }

3.6 输出结果

image.png

3.7 参考链接

http://www.cplusplus.com/reference/algorithm/find_first_of/


4. find_if()函数

功能:返回[first, last)里满足特定条件的第一个元素的迭代器

4.2 函数声明

template <class InputIterator, class UnaryPredicate>
   InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);

4.3 等价操作实现

template <class InputIterator, class UnaryPredicate>
   InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) {
  while (first != last) {
    if (pred(*first)) return first;
  }
  return last;
}

4.4 参数详解

额...参考2.4

4.5 示例程式

bool IsOdd(int i) {
        return (i % 2 == 1);
    }
    
    void test_find_if() {
        std::vector<int> myvector;

        myvector.push_back(10);
        myvector.push_back(25);
        myvector.push_back(40);
        myvector.push_back(55);
    
      std::vector<int>::iterator it = std::find_if (myvector.begin(), myvector.end(), IsOdd);
      std::cout << "The first odd value is " << *it << '\n';
    }

4.6 输出结果

image.png

4.7 参考链接

http://www.cplusplus.com/reference/algorithm/find_if/

5. find_if_not()函数

功能:返回[first, last)里第一个不满足条件的元素的迭代器,与find_if()函数功能相反

5.1 函数声明

template <class InputIterator, class UnaryPredicate>
   InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);

5.2 等价操作实现

template<class InputIterator, class UnaryPredicate>
  InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last) {
    if (!pred(*first)) return first;
    ++first;
  }
  return last;
}

5.3 参数详解

参考4.3

5.4 返回值

[first, last)里第一个不满足pred的元素的迭代器

5.5 示例程式

void test_find_if_not() {
        std::array<int,5> foo = {1,2,3,4,5};

        std::array<int,5>::iterator it =
        std::find_if_not (foo.begin(), foo.end(), [](int i){return i%2;} );
        std::cout << "The first even value is " << *it << '\n';
    }

5.6 输出结果

image.png

5.7 参考链接

http://www.cplusplus.com/reference/algorithm/find_if_not/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341