标准库里find系列函数

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

1. find()函数

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

1.1 函数声明

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

1.2 等价操作实现

template
  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 vec(arr, arr+4);
        vector::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
  ForwardIterator1 find_end(ForwardIterator1 first, ForwardIterator1 last1,
  ForwardIterator2 first2, ForwardIterator2 last2)

2.1.2 基于自定义谓词的比较

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

2.2. 等价操作实现

template
  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 haystack (myints,myints+10);
        
        int needle1[] = {1,2,3};
    
        // using default comparison:
        std::vector::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
  InputIterator find_first_of(InputIterator first1, InputIterator last1, 
                              ForwardIterator first2, ForwardIterator last2)

3.1.2 基于自定义谓词的比较

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

3.2 等价操作实现

template
  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 charvec(chars, chars+6);
        
        vector::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 
   InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);

4.3 等价操作实现

template 
   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 myvector;

        myvector.push_back(10);
        myvector.push_back(25);
        myvector.push_back(40);
        myvector.push_back(55);
    
      std::vector::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 
   InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);

5.2 等价操作实现

template
  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 foo = {1,2,3,4,5};

        std::array::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/

你可能感兴趣的:(标准库里find系列函数)