<algorithm>
算法库
C++ 标准库中的 <algorithm>
头文件提供了一组强大且通用的算法,能够对容器中的数据进行操作。这些算法包括排序、搜索、变换等操作,广泛用于各种数据处理任务。<algorithm>
中的算法设计遵循泛型编程思想,与容器解耦,允许在各种容器类型上使用这些算法。
1. 常用算法
1.1 排序算法
std::sort
对指定范围内的元素进行排序,默认为升序。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
std::sort(vec.begin(), vec.end());
for (const auto& num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
std::stable_sort
对指定范围内的元素进行排序,保持相等元素的相对顺序。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<std::pair<int, std::string>> vec = {{1, "one"}, {2, "two"}, {1, "uno"}};
std::stable_sort(vec.begin(), vec.end(), [](const auto& a, const auto& b) {
return a.first < b.first;
});
for (const auto& pair : vec) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
return 0;
}
1.2 搜索算法
std::find
在指定范围内查找第一个匹配的元素。
#include <algorithm>
#include <vector>
#include <iostream>
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: " << *it << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
return 0;
}
std::binary_search
检查指定值是否存在于已排序的范围内。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
bool found = std::binary_search(vec.begin(), vec.end(), 3);
std::cout << (found ? "Found" : "Not found") << std::endl;
return 0;
}
1.3 变换算法
std::transform
对指定范围内的每个元素应用指定的函数,并将结果存储在另一个范围内。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::vector<int> result(vec.size());
std::transform(vec.begin(), vec.end(), result.begin(), [](int x) {
return x * x;
});
for (const auto& num : result) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
std::for_each
对指定范围内的每个元素应用指定的函数。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::for_each(vec.begin(), vec.end(), [](int x) {
std::cout << x << " ";
});
std::cout << std::endl;
return 0;
}
1.4 其他算法
std::accumulate
计算范围内所有元素的总和(或应用指定的二元操作)。
#include <numeric>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
int sum = std::accumulate(vec.begin(), vec.end(), 0);
std::cout << "Sum: " << sum << std::endl;
return 0;
}
std::count
计算指定值在范围内出现的次数。
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 2, 2, 5};
int count = std::count(vec.begin(), vec.end(), 2);
std::cout << "Count of 2: " << count << std::endl;
return 0;
}
2. 使用指南
- 选择合适的算法:根据数据处理的需求选择合适的算法,如排序、查找或变换。
- 避免重复计算:利用 STL 算法避免手动编写复杂的循环和条件判断,提高代码的可读性和性能。
- 理解算法的时间复杂度:选择适当的算法时,了解其时间复杂度,以优化程序性能。
3. 总结
<algorithm>
头文件中的算法提供了对容器元素的高效操作。通过泛型编程,这些算法能够与多种容器类型配合使用,从而实现强大的数据处理能力。熟练掌握这些算法对于编写高效、可维护的 C++ 代码至关重要。