C++ STL 算法完全指南 - 提升编程效率与代码质量

C++ 标准库的 <algorithm> 提供了大量通用的算法, 用于操作容器, 范围和迭代器. 本文对其做了归纳总结, 并配上代码以供读者了解其功能. 整理不易, 希望您点赞或者收藏, 非常感谢.

本文所有代码均可在此处获取.

编译器要求

本文的代码需要编译器支持 C++23 标准才可以运行. 另外部分示例目前需要使用 Visual Studio(MSVC) 才可以编译通过. 本文示例在如下编译器上面编译通过:

批处理操作

搜索操作

这些算法不会修改容器中的元素, 主要用于查询, 统计和范围操作.

检查元素

查找

计数

比较


Fold operations (C++23)

修改序列

这些算法会修改容器或范围中的元素.

拷贝和移动

交换操作

变换操作

变换

std::vector<int> numbers = {1, 2, 3, 4, 5};
std::vector<int> result(numbers.size());

// 使用 transform 将每个元素乘以 2 并存储到 result 中
std::transform(numbers.begin(), numbers.end(), result.begin(),
                [](int num) { return num * 2; });

// 使用 ranges::transform 做同样的操作
std::vector<int> resultRanges(numbers.size());
std::ranges::transform(numbers, resultRanges.begin(),
                        [](int num) { return num * 2; });

// 输出 transform 的结果
fmt::print("transform 结果: {}\n", result);

// 输出 ranges::transform 的结果
fmt::print("ranges::transform 结果: {}\n", resultRanges);

替换

生成操作

移除操作


改变顺序的操作

// shuffle
void shuffleExample() {
  std::vector<int> vec = {1, 2, 3, 4, 5};
  std::random_device rd;
  std::mt19937 g(rd());
  fmt::println("Original vector for shuffle: {}", vec);
  // 预期输出: Original vector for shuffle: [1, 2, 3, 4, 5]
  std::shuffle(vec.begin(), vec.end(), g);
  fmt::println("After std::shuffle: {}", vec);  // 预期输出: 随机打乱后的向量
}

// ranges::shuffle
void rangesShuffleExample() {
  std::vector<int> vec = {1, 2, 3, 4, 5};
  std::random_device rd;
  std::mt19937 g(rd());
  fmt::println("Original vector for ranges::shuffle: {}", vec);
  // 预期输出: Original vector for ranges::shuffle: [1, 2, 3, 4, 5]
  std::ranges::shuffle(vec, g);
  fmt::println("After std::ranges::shuffle: {}",
               vec);  // 预期输出: 随机打乱后的向量
}

抽样操作

partition 操作

排序相关算法

排序算法对范围中的元素重新排列.

二分查找

集合操作

Merge operations

堆操作

最大最小值

Lexicographical comparison operations

排列


数值操作

参考链接

Tags: