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

时间:2014-01-09 10:17:03

标签: c++ find std

我想了解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);

它们都返回相同的东西:[first1,last1]内第一次出现序列[first2,last2]的迭代器。 (使用相等或二元谓词)

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

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:9)

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
}

Runnable on Coliru.

答案 2 :(得分:3)

std::search()找到匹配整个[first2..last2)序列的元素范围,而find_first_of()找到匹配[first2..last2)中某个元素的第一个元素