std::search 和 std::find_first_of 之间的区别
Difference between std::search and std::find_first_of
我试图掌握std::search
和std::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)
中的一个元素匹配的第一个单个元素。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- std::memmove在同一对象之间是否始终安全
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- std::fabs(a * b) 和 std::fabs(a) * std::fabs(b) 之间的区别
- 如何在窗口之间移动 std::unique_ptr 而不会冒内存泄漏的风险?
- 简单使用 std::atomic 在两个线程之间共享数据
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- "std::function<double(double)>"到"double (*)(double)"之间的转换
- malloc 和 calloc 与 std::string 之间的区别
- std::random_device和std::mt19937_64之间有什么区别
- 是std::memcpy在不同的可复制类型之间的未定义行为
- 我收到void main()和使用命名空间std;之间的冲突;?我正在使用代码块
- iostream和命名空间std之间的关系是什么?