如何提升std::unique相关STL代码的自然语言可读性?
如何理解反直觉的std::unique用法?
我习惯编写读起来像普通英语的代码,但这段代码字面读起来像是“删除所有唯一元素”,实际功能却完全相反——它是保留唯一元素(实现容器去重)。我并非要修改STL或ranges,只是好奇有没有技巧能理解std::unique,让这段代码的读法不那么反直觉,毕竟代码里没有“not”这类反向词汇辅助,请问读这段代码的最佳方式是什么?
STL版本代码
std::vector<T> v = …; std::sort(v.begin(), v.end()); v.erase(std::unique(v.begin(), v.end()), v.end());
Ranges版本代码
std::vector<T> v = …; std::ranges::sort(v); v.erase(std::ranges::unique(v), v.end());
理解技巧与读法建议
- 先纠正对
std::unique的字面误解:它的真实作用不是“删除唯一元素”,而是将容器中连续重复的元素移动到容器尾部,返回的是去重后有效元素区间的尾迭代器。 - 拆分步骤读整个逻辑:
- 先排序:把容器内相同的元素聚集在一起,让重复元素变成连续的
- 调用
std::unique:把连续的重复元素挪到容器后面,前面留下的是每个元素的唯一副本 - 调用
erase:从unique返回的位置开始删到末尾,去掉那些被移到后面的重复元素
- 换成自然语言的读法:“排序后,把连续重复的元素移到容器末尾,再删掉末尾的重复部分”,这样就能对应上“去重保留唯一元素”的实际功能
- 最直接的方式是给这段逻辑加注释,比如
// 容器去重:排序后移除重复元素,直接点明代码意图,不用纠结函数名的字面歧义
内容的提问来源于stack exchange,提问作者Damir Tenishev
相关产品推荐
相关产品推荐

