std::search 和 std::find_first_of 之间的区别

Difference between std::search and std::find_first_of

本文关键字:std 之间 区别 of first find search      更新时间:2023-10-16

我试图掌握std::searchstd::find_first_of之间的区别

它们具有相同的原型:

template <class ForwardIterator1, class ForwardIterator2>
   ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,
                                   ForwardIterator2 first2, ForwardIterator2 last2);
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
   ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,
                                   ForwardIterator2 first2, ForwardIterator2 last2,
                                   BinaryPredicate pred);
template <class ForwardIterator1, class ForwardIterator2>
   ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,
                            ForwardIterator2 first2, ForwardIterator2 last2);
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
   ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,
                            ForwardIterator2 first2, ForwardIterator2 last2,
                            BinaryPredicate pred);

它们都返回相同的内容:迭代器 [first2, last2) 在 [first1, last1) 中的第一个出现。(使用相等或二进制谓词)

那么有什么区别呢?我错了吗?

不同之处在于,std::search搜索另一个范围内的整个元素范围,而std::find_first_of搜索另一个范围内的单个元素。

std::find_first_of正在搜索范围内查找任何元素。它将向 [s_first1, s_first2] 中任何元素的第一次出现返回迭代器。

std::search正在寻找您传递的整个序列。这样,它将向序列[s_first1, s_first2]的第一个出现返回迭代器。

#include <vector>
#include <iostream>
#include <algorithm>
int main() {
    std::vector<int> A{1, 2, 3, 2, 4, 6, 5};
    std::vector<int> search_range{2, 4, 6};
    std::vector<int> find_first_of_range{6, 5};
    auto it_search = std::search(A.begin(), A.end(),
        search_range.begin(), search_range.end());
    std::cout << std::distance(A.begin(), it_search) << std::endl; // 3
    auto it_find_first_of = std::find_first_of(A.begin(), A.end(),
        find_first_of_range.begin(), find_first_of_range.end());
    std::cout << std::distance(A.begin(), it_find_first_of) << std::endl; // 5
}

在科利鲁上可运行。

std::search()查找与整个[first2..last2)序列匹配的元素范围的位置,而find_first_of()查找与[first2..last2)中的一个元素匹配的第一个单个元素。