为什么std::random_shuffle实现使用std::swap而非std::iter_swap?
关于std::random_shuffle实现用std::swap而非std::iter_swap的说明
首先要明确前提:std::random_shuffle要求传入的迭代器必须是随机访问迭代器,支持operator[]和直接的算术偏移操作,所以两种写法在这个场景下都合法,最终运行效果、性能没有本质差异,选择swap主要是以下两个原因:
- 示例代码优先保证可读性
这是cppreference给出的简化示例,核心是展示洗牌算法的核心逻辑,swap(first[i], first[std::rand() % (i+1)])的写法更直观,哪怕是刚接触C++的开发者也能一眼看出来是交换序列第i位和随机位置的元素,不需要额外理解iter_swap「交换两个迭代器指向元素」的语义,降低了示例的理解门槛。 - ADL(参数依赖查找)适配更简洁
代码里using std::swap; swap(...)是C++通用的交换惯用法:如果元素类型自定义了同命名空间下的swap函数,会优先调用自定义的高效实现,不会死板地使用默认的std::swap。如果要改用iter_swap达到同样的ADL适配效果,需要额外加一行using std::iter_swap;再调用无命名空间限定的iter_swap,对示例代码来说属于不必要的冗余,所以直接用了更简洁的swap写法。
补充说明:如果你的算法需要兼容非随机访问迭代器(比如双向迭代器、前向迭代器),不支持operator[]操作,那iter_swap就是更优选择,它可以统一适配所有可解引用的迭代器类型,不需要关心迭代器的具体类别。
内容的提问来源于stack exchange,提问作者Itachi Uchiwa
相关产品推荐
相关产品推荐

