在日常的开发中,常涉及到容器的常见操作,如查找、删除、排序等,C STL提供了丰富的算法库,可以方便地完成这些操作。为了避免重复造轮子,同时为了提高效率,了解常见的STL算法是非常有必要的。本文将介绍查找相关算法。
1. std::find
功能:查找范围内第一个满足条件的元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::find(vec.begin(), vec.end(), 3);
if (it != vec.end()) {
std::cout << "Found 3 at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "3 not found" << std::endl;
}
}
2. std::find_if
功能:查找范围内第一个满足条件的元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::find_if(vec.begin(), vec.end(), [](inti){ return i % 2 == 0; });
if (it != vec.end()) {
std::cout << "Found even number at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "No even number found" << std::endl;
}
}
3. std::find_if_not
功能:查找范围内第一个不满足条件的元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
intmain() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::find_if_not(vec.begin(), vec.end(), [](inti){ return i % 2 == 0; });
if (it != vec.end()) {
std::cout << "Found odd number at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "All numbers are even" << std::endl;
}
}
4. std::find_end
功能:在范围内查找最后一个子序列的位置,注意是子序列,不是子序列内的某个或某几个元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5, 3, 4, 5};
std::vector<int> sub = {3, 4, 5}; // 子序列
auto it = std::find_end(vec.begin(), vec.end(), sub.begin(), sub.end());
if (it != vec.end()) {
std::cout << "Last occurrence of subsequence found at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "Subsequence not found" << std::endl;
}
}
5. std::find_first_of
功能:在范围内查找第一个与给定集合中任意元素匹配的元素的位置。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> sub = {3, 4, 6}; // 子序列
auto it = std::find_first_of(vec.begin(), vec.end(), sub.begin(), sub.end());
if (it != vec.end()) {
std::cout << "First match found at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "No match found" << std::endl;
}
}
6. std::adjacent_find
功能:查找范围内第一个相邻元素对的位置。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
intmain() {
std::vector<int> vec = {1, 2, 2, 3, 4, 5};
auto it = std::adjacent_find(vec.begin(), vec.end());
if (it != vec.end()) {
std::cout << "Found adjacent pair at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "No adjacent pair found" << std::endl;
}
}
7. std::binary_search
功能:在已排序的范围内查找元素是否存在。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
bool found = std::binary_search(vec.begin(), vec.end(), 3); // 3 is in the vector
if (found) {
std::cout << "3 found" << std::endl;
} else {
std::cout << "3 not found" << std::endl;
}
}
8. std::upper_bound
功能:在有序范围中查找第一个大于指定值的元素的位置。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 4, 4, 5};
auto it = std::upper_bound(vec.begin(), vec.end(), 3);
if (it != vec.end()) {
std::cout << "First element greater than 3 is: " << *it << std::endl;
} else {
std::cout << "No element greater than 3 found" << std::endl;
}
}
9. std::lower_bound
功能:在有序范围中查找第一个大于等于指定值的元素的位置,与std::upper_bound 类似。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 4, 4, 5};
auto it = std::lower_bound(vec.begin(), vec.end(), 3);
if (it != vec.end()) {
std::cout << "First element greater than or equal to 3 is: " << *it << std::endl;
} else {
std::cout << "No element greater than or equal to 3 found" << std::endl;
}
}
10. std::equal_range
功能:在有序范围中查找等于指定值的元素的范围。std::equal_range 返回一个 std::pair,其中 first 指向范围的开始(等于指定元素),second 指向范围的结束(第一个大于指定元素的元素)。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 4, 4, 5};
auto range = std::equal_range(vec.begin(), vec.end(), 4);
std::cout << "Range of 4: [" << std::distance(vec.begin(), range.first) << ", " << std::distance(vec.begin(), range.second) << "]" << std::endl;
}
11. std::search
功能:在范围内查找子序列的位置,注意是子序列的位置,不是子序列内的某个或某几个元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> sub = {3, 4}; // 子序列
auto it = std::search(vec.begin(), vec.end(), sub.begin(), sub.end());
if (it != vec.end()) {
std::cout << "Subsequence found at index: " << std::distance(vec.begin(), it) << std::endl;
} else {
std::cout << "Subsequence not found" << std::endl;
}
}
12. std::mismatch
功能:在两个范围内查找第一个不匹配的位置。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec1 = {1, 2, 3, 4, 5};
std::vector<int> vec2 = {1, 2, 4, 4, 5};
// 查找第一个不匹配的元素对
auto result = std::mismatch(vec1.begin(), vec1.end(), vec2.begin());
if (result.first != vec1.end() || result.second != vec2.end()) {
std::cout << "First mismatch found at vec1[" << (result.first - vec1.begin()) << "] = " << *(result.first)
<< " and vec2[" << (result.second - vec2.begin()) << "] = " << *(result.second) << std::endl;
} else {
std::cout << "No mismatch found, vectors are identical." << std::endl;
}
// 使用自定义谓词查找第一个不匹配的元素对
auto result_pred = std::mismatch(vec1.begin(), vec1.end(), vec2.begin(), [](inta, intb) { return a != b; });
if (result_pred.first != vec1.end() || result_pred.second != vec2.end()) {
std::cout << "First mismatch found at vec1[" << (result_pred.first - vec1.begin()) << "] = " << *(result_pred.first)
<< " and vec2[" << (result_pred.second - vec2.begin()) << "] = " << *(result_pred.second) << std::endl;
} else {
std::cout << "No mismatch found, vectors are identical according to the predicate." << std::endl;
}
return0;
}
13. std::min_element
功能:在范围内查找最小元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::min_element(vec.begin(), vec.end());
if (it != vec.end()) {
std::cout << "Minimum element is: " << *it << std::endl;
} else {
std::cout << "Vector is empty" << std::endl;
}
14. std::max_element
功能:在范围内查找最大元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto it = std::max_element(vec.begin(), vec.end());
if (it != vec.end()) {
std::cout << "Maximum element is: " << *it << std::endl;
} else {
std::cout << "Vector is empty" << std::endl;
}
}
15. std::minmax_element
功能:在范围内查找最小和最大元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
auto result = std::minmax_element(vec.begin(), vec.end());
if (result.first != vec.end() && result.second != vec.end()) {
std::cout << "Minimum element is: " << *result.first << std::endl;
std::cout << "Maximum element is: " << *result.second << std::endl;
} else {
std::cout << "Vector is empty" << std::endl;
}
}
16. std::includes
功能:判断一个有序范围是否包含另一个有序范围的所有元素。
代码语言:javascript复制#include<iostream>
#include<vector>
#include<algorithm>
int main() {
std::vector<int> vec1 = {1, 2, 3, 4, 5};
std::vector<int> vec2 = {3, 4, 5};
bool result = std::includes(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());
if (result) {
std::cout << "vec2 is included in vec1" << std::endl;
} else {
std::cout << "vec2 is not included in vec1" << std::endl;
}
}
总结
C 标准库提供了多种查找算法,可以根据不同的需求选择合适的算法。本文介绍了一些常用的查找算法,包括 std::find、std::find_if、std::find_if_not、std::find_first_of、std::find_end、std::adjacent_find、std::upper_bound、std::equal_range、std::search 和 std::mismatch等。希望这些内容对你有所帮助。