C++初学者指南-5.标准库(第一部分)–标准库查找算法
文章目录
不熟悉 C++ 的标准库算法? ⇒ 简介
查找/定位一个元素
find
返回第一个等于value的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference
运行示例代码
返回第一个等于value的元素的迭代器
没有找到则返回@end位置的迭代器
cppreferencestd::vector<int> v {4,1,3,8,5,8,2}; auto i = std::ranges::find(v, 8); if (i != end(v)) { // true ⇒ found auto const value = *i; // int value = 8 auto const index = distance(begin(v), i); // index = 3 }
find_if
返回第一个在 f 中返回true的元素的迭代器
没有找到则返回@end位置的迭代器
cppreferencestd::vector<int> v {9,0,4,1,8,3,7,2,9}; auto const f = [](int x) { return x >= 6; }; // 在子范围中查找(如图所示): auto i = find_if (begin(v)+2, begin(v)+7, f); // i != end-of-range? if (i != begin(v)+7) { // true ⇒ found auto const value = *i; // int value = 8 } // 在整个vector中查找: auto j = find_if (begin(v), end(v), f); if (j != end(v)) { // true ⇒ found auto const value = *j; // int value = 9 auto const index = distance(begin(v), j); // index = 0 }
返回第一个在 f 中返回true的元素的迭代器
没有找到则返回@end位置的迭代器
cppreferencestd::vector<int> v {4,1,8,3,7}; auto const f = [](int x) { return x >= 6; }; auto i = std::ranges::find_if (v, f); if (i != end(v)) { // true ⇒ found auto const value = *i; // int value = 8 auto const index = distance(begin(v), i); // index = 2 }
find_if_not
返回第一个在 f 中返回false的元素的迭代器
没有找到则返回@end位置的迭代器
cppreferencestd::vector<int> v {9,0,4,1,3,0,5,2,9}; auto const f = [](int x) { return x >= 2; }; // 在子范围中查找(如图所示): auto i = find_if_not(begin(v)+2, begin(v)+7, f); // i != end-of-range? if (i != begin(v)+7) { // true ⇒ found auto const value = *i; // int value = 1 } // 在整个vector中查找: auto j = find_if_not(begin(v), end(v), f); if (j != end(v)) { // true ⇒ found auto const value = *j; // int value = 0 auto const index = distance(begin(v), j); // index = 1 }
std::vector<int> v {4,1,3,0}; auto const f = [](int x) { return x >= 2; }; auto i = std::ranges::find_if_not(v, f); if (i != end(v)) { // true ⇒ found auto const value = *i; // int value = 1 auto const index = distance(begin(v), i); // index = 1 }
find_last / find_last_if / find_last_if_not
返回输入范围内的最后一个和value相等的元素的视图,视图为空则没有找到std::vector<int> v {2,1,7,1,1,5,8}; // 注意:可能尚未可用 // 在很多标准库的实现中! auto const result = std::ranges::find_last(v, 1); if (not result.empty()) { // if found auto const value = result.front(); // int value = 1 auto const index = distance(begin(v),begin(result)); // index = 4 } for (int x : result) { cout << x << ' '; } // 1 5 8
std::vector<int> v {4,1,3,8,1}; auto const f = [](int x) { return x >= 2; }; // 注意:可能尚未可用 // 在很多标准库的实现中! auto const result = std::ranges::find_last_if (v, f); if (not result.empty()) { // if found auto const value = result.front(); // int value = 8 auto const index = distance(begin(v),begin(result)); // index = 3 } for (int x : result) { cout << x << ' '; } // 8 1
std::vector<int> v {4,0,3,1,5}; auto const f = [](int x) { return x >= 2; }; // 注意:可能尚未可用 // 在很多标准库的实现中! auto const result = std::ranges::find_last_if_not(v, f); if (not result.empty()) { // if found auto const value = result.front(); // int value = 1 auto const index = distance(begin(v),begin(result)); // index = 3 } for (int x : result) { cout << x << ' '; } // 1 5
find_first_of
返回一个迭代器,指向范围s中与范围w中任何元素相等的第一个元素;如果没有找到这样的元素,则返回@send位置的迭代器。
cppreferencestd::vector<int> s {0,1,3,2,5,7,4,8,9,9}; std::vector<int> w {1,4,6,5,8,7}; // 在子范围内查找,如图所示: auto i = find_first_of(begin(s)+1, begin(s)+9, begin(w)+1, begin(w)+4); // i != end-of-range? if (i != begin(s)+9) { // true ⇒ found one auto const value = *i; // int value = 5 auto const index = distance(begin(s), i); // index = 4 } // 在s中查找w中的任意元素: auto j = find_first_of(begin(s), end(s), begin(w), end(w)); if (j != end(s)) { // true ⇒ found one auto const value = *j; // int value = 1 auto const index = distance(begin(s), j); // index = 1 }
返回一个迭代器,指向范围s中与范围w中的任何元素相等的第一个元素;如果没有找到这样的元素,则返回@end(s)。
cppreferencestd::vector<int> s {3,2,5,7,4,8}; std::vector<int> w {4,6,5}; auto i = std::ranges::find_first_of(s, w); if (i != end(s)) { // true ⇒ found one auto const value = *i; // int value = 5 auto const index = distance(begin(s), i); // index = 2 }
查找范围内的子范围
search
如果在S的子范围内具有指定的W范围内的子范围,则返回S子范围内此查找到的第一个子范围的第一个元素的迭代器,否则返回S子范围的末尾迭代器。
cppreferencestd::vector<int> s {0,4,6,5,1,4,6,5,8,9}; std::vector<int> w {1,4,6,5,8,9}; //在's'的子范围中找到'w'的子范围(如图所示): auto i = search(begin(s)+1, begin(s)+9, begin(w)+1, begin(w)+4); // i != end-of-range? if (i != begin(s)+9) { // true ⇒ found auto const value = *i; // int value = 4 auto const index = distance(begin(s), i); // index = 1 } // 在's'中找到所有的'w': auto j = search(begin(s), end(s), begin(w), end(w)); if (j != end(s)) { // true ⇒ found auto const value = *j; // int value = 1 auto const index = distance(begin(s), j); // index = 4 }
std::vector<int> s {1,4,6,5,8,4,6,5}; std::vector<int> w {4,6,5}; auto r = std::ranges::search(s, w); if (not empty(r)) { for (int x : r) { cout << x << ' '; } // 4 6 5 }
find_end
如果在S的子范围内具有指定的W范围内的子范围,则返回S子范围内此查找到的最后一个子范围的第一个元素的迭代器,否则返回S子范围的末尾迭代器。
cppreferencestd::vector<int> s {0,4,6,5,1,4,6,5,8,9}; std::vector<int> w {1,4,6,5,8,9}; // 在's'的子范围中找到'w'的子范围(如图所示): auto i = find_end(begin(s)+1, begin(s)+9, begin(w)+1, begin(w)+4); // i != end-of-range? if (i != begin(s)+9) { // true ⇒ found auto const value = *i; // int value = 4 auto const index = distance(begin(s), i); // index = 5 } // 在所有的's'中找到所有的'w': auto j = find_end(begin(s), end(s), begin(w), end(w)); if (j != end(s)) { // true ⇒ found auto const value = *j; // int value = 1 auto const index = distance(begin(s), j); // index = 4 }
std::vector<int> s {1,4,6,5,8,4,6,5}; std::vector<int> w {4,6,5}; auto r = std::ranges::find_end(s, w); if (not empty(r)) { for (int x : r) { cout << x << ' '; } // 4 6 5 }
starts_with
std::vector<int> s {0,4,8,6,2,1,9}; std::vector<int> w {9,4,8,6,7,3}; // 注意:可能尚未可用 // 在很多标准库的实现中! if (std::ranges::starts_with(begin(s)+1, begin(s)+6, begin(w)+1, begin(w)+4) ) { cout << "yes!\n"; }
std::vector<int> s {4,6,5,8,7,3}; std::vector<int> w {4,6,5}; // 注意:可能尚未可用 // 在很多标准库的实现中! if (std::ranges::starts_with(s, w) ) { cout << "yes!\n"; }
ends_with
std::vector<int> s {0,4,8,6,2,1,9}; std::vector<int> w {9,6,2,1,7,3}; // 注意:可能尚未可用 // 在很多标准库的实现中! if (std::ranges::ends_with(begin(s)+1, begin(s)+6, begin(w)+1, begin(w)+4) ) { cout << "yes!\n"; }
std::vector<int> s {4,6,5,8,7,3}; std::vector<int> w {8,7,3}; // 注意:可能尚未可用 // 在很多标准库的实现中! if (std::ranges::ends_with(s, w) ) { cout << "yes!\n"; }
找到连续相等元素序列
adjacent_find
返回第一个连续相等元素范围的第一个元素的迭代器
如果没有则返回范围的末尾迭代器
可以作为第三个参数传递一个自定义的函数(对象)来比较元素std::vector<int> v {5,5,2,8,2,2,3,3,2,8}; // 在子范围中查找,如图所示: auto i = adjacent_find(begin(v)+1, begin(v)+8); // i != end-of-range? if (i != begin(v)+8) { // true ⇒ found auto const value = *i; // int value = 2 auto const index = distance(begin(v), i); // index = 4 } // 在整个vector中查找: auto j = adjacent_find(begin(v), end(v)); if (j != end(v)) { // true ⇒ found auto const value = *j; // int value = 5 auto const index = distance(begin(v), j); // index = 0 }
用于比较元素的自定义函数(对象)可以作为第二个参数传递
cppreferencestd::vector<int> v {5,2,8,2,2,3,3}; auto i = std::ranges::adjacent_find(v); if (i != end(v)) { // true ⇒ found auto const value = *i; // int value = 2 auto const index = distance(begin(v), i); // index = 3 }
search_n
返回n个连续值为value的序列的第一次出现的第一个元素位置的迭代器
如果没有则范围子范围末尾位置的迭代器
用于比较元素的自定义函数(对象)可以作为第 5 个参数传递
cppreferencestd::vector<int> v {0,5,2,2,8,2,2,2,9,9,9}; // 在子范围内找到3个2的连续出现(如图所示): const auto n = 3; auto i = search_n(begin(v)+1, begin(v)+9, n, 2); // i != end-of-range? if (i != begin(v)+9) { // true ⇒ found auto const value = *i; // int value = 2 auto const index = distance(begin(v), i); // index = 5 } // 在整个向量中寻找连续的3个9: auto j = search_n(begin(v), end(v), n, 9); if (j != end(v)) { // true ⇒ found auto const value = *j; // int value = 9 auto const index = distance(begin(v), j); // index = 8 }
用于比较元素的自定义函数(对象)可以作为第四个参数传递
cppreferencestd::vector<int> v {2,2,8,2,2,2,9}; const auto n = 3; auto r = std::ranges::search_n(v, n, 2); if (not empty(r)) { // true ⇒ found auto const value = r[0]; // int value = 2 auto const index = distance(begin(v), begin(r)); // index = 3 }
相关内容
视频:adjacent_find by Conor Hoekstra
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^