Bootstrap

C++初学者指南-5.标准库(第一部分)--标准库查找算法

C++初学者指南-5.标准库(第一部分)–标准库查找算法


不熟悉 C++ 的标准库算法? ⇒ 简介

查找/定位一个元素

find

在这里插入图片描述
返回第一个等于value的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference
在这里插入图片描述
运行示例代码

在这里插入图片描述
返回第一个等于value的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference

std::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位置的迭代器
cppreference

std::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位置的迭代器
cppreference

std::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位置的迭代器
cppreference

std::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
}

运行示例代码

在这里插入图片描述
cppreference

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相等的元素的视图,视图为空则没有找到

cppreference

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

运行示例代码

在这里插入图片描述
cppreference

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

运行示例代码

在这里插入图片描述
cppreference

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位置的迭代器。
cppreference

std::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)。
cppreference

std::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子范围的末尾迭代器。
cppreference

std::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
}

运行示例代码

在这里插入图片描述
cppreference

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子范围的末尾迭代器。
cppreference

std::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
}

运行此示例代码

在这里插入图片描述
cppreference

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

在这里插入图片描述
cppreference

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";
}

运行示例代码

在这里插入图片描述
cppreference

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

在这里插入图片描述
cppreference

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";
}

运行示例代码

在这里插入图片描述
cppreference

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
}

运行示例代码

在这里插入图片描述
用于比较元素的自定义函数(对象)可以作为第二个参数传递
cppreference

std::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 个参数传递
cppreference

std::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
}

运行示例代码

在这里插入图片描述
用于比较元素的自定义函数(对象)可以作为第四个参数传递
cppreference

std::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++ 之旅:容器和算法
算法概述表:
在这里插入图片描述
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

;