用途:这是一份 C++ 编码风格与重构指南,遵循 Sean Parent 的“No Raw Loops”(无裸循环)理念。核心主张是:裸循环相当于算法的汇编语言,写循环通常意味着漏用了算法;代码应直接表达意图,而非暴露递增、比较等实现机制。
主要能力:
- 设计原则:无裸循环;用具名算法表达意图(std::find_if 表示“搜索”,for 循环只表示“递增并比较”);以组合替代迭代;剔除与语义无关的代码;为中间变量和自定义操作命名。
- 算法速查表:按用途归类——存在性查询(std::any_of、all_of、none_of、count_if)、查找(find_if、mismatch、search、lower_bound、upper_bound)、变换(transform、fill、generate、copy_if)、重排(sort、stable_sort、partition、stable_partition、rotate、remove_if)。
- 代码模式:transform 替代逐元素循环;accumulate 替代手工聚合;remove_if + erase 或 C++20 std::erase_if 替代易出错的边遍历边删除;C++20 ranges 管道(filter、transform、ranges::to)让意图更清晰。
- 签名算法示例:slide(在序列内把区间移动到新位置,返回新的首尾迭代器)与 gather(把满足谓词的元素聚集到指定位置),文中给出模板定义与调用方式。
使用方式:把该规范作为编写与评审 C++ 代码的检查清单。遇到循环时按重构自检提问其本质:是搜索、变换、重排、聚合还是比较,并选用对应算法;若标准算法不完全匹配,就先命名并实现一个自定义算法。文中强调优先使用 C++20 ranges 与具名变量记录意图。
适用场景:C++ 代码编写、代码评审与遗留代码重构,尤其适合希望提升可读性、减少嵌套循环、用算法组合表达业务语义的团队。
限制:资料未提供具体安装命令、依赖要求、版本兼容细节、性能基准、收费或授权信息(暂未提供)。文中部分示例为教学说明(如一次 transform 后“再过滤 nullopt 或使用自定义 transform_if”),并非完整可编译方案;slide、gather 的实现假定迭代器为随机访问迭代器,用于其他迭代器类别时需另行处理。