为何STL提供std::prev_permutation?是否违反DRY原则?
为什么STL要提供std::prev_permutation?是否违反DRY原则?
先看这两段执行结果完全一致的代码:
第一段:
std::string s="abc"; std::prev_permutation(std::begin(s), std::end(s), std::greater<char>());
第二段:
std::string s="abc"; std::next_permutation(std::begin(s), std::end(s), std::less<char>());
既然用next_permutation配合反向比较器就能模拟prev_permutation的效果,那STL为啥还要单独提供这个函数?是不是违反DRY原则了?
答案很简单:这是合理的冗余,完全不违反DRY,原因有三:
- 可读性碾压模拟写法:当你需要获取当前序列的前一个排列时,直接写
std::prev_permutation,任何看代码的人都能瞬间get你的意图。反过来用next_permutation加greater<char>,别人还得反应一下“哦,原来这是在找前序排列”,维护起来多了一层理解成本。 - 实现效率有差异:虽然功能可以互相模拟,但
prev_permutation的底层是专门针对“找前序排列”的逻辑实现的,和反向调用next_permutation的执行路径不一样。在一些性能敏感的场景下,原生实现比模拟写法更高效,省去了比较器反转带来的额外开销。 - API设计的对称性与完整性:STL的接口设计讲究直觉性和对称性——有
next就该有prev,成对出现的接口符合开发者的使用习惯,不用去记“要找前序排列得反过来调next”这种特殊技巧,降低了学习和使用的门槛。
DRY原则反对的是无意义的重复代码/逻辑,而这两个函数是为了满足不同的使用场景、提升代码可读性存在的,属于“有目的的冗余”,完全在合理范围内。
内容的提问来源于stack exchange,提问作者triclosan
相关产品推荐
相关产品推荐

