【发布时间】:2017-03-19 14:33:45
【问题描述】:
我还没有找到合适的来源。 <algorithm> 标头中的所有算法是否都使用 std::advance 来增加(并且可能减少)迭代器?
还有另一个相关的后续行动——我看到了 RandomAccessIterator 概念的 cppreference 页面 (http://en.cppreference.com/w/cpp/concept/RandomAccessIterator),但它没有解决迭代器类别的成员别名的要求。如果迭代器类没有名为 iterator_category 的成员 typedef 别名为 random_access_iterator_tag 但支持 RandomAccessIterator 的 cppreference 页面 (http://en.cppreference.com/w/cpp/concept/RandomAccessIterator) 中提到的操作,c++ 标准库是否假定迭代器是随机访问迭代器?
注意我的意思是参考 C++ 标准来问这个问题。即“标准对此有何评论?”
【问题讨论】:
-
@SamVarshavchik 我问这个问题是为了从标准中寻找可能的报价。只看实现是不够的,因为它可以在保持标准的同时改变。还有
std::upper_bound和std::lower_bound在大多数实现中经常使用std::advance来推进迭代器n步骤 -
标准描述了工作上的约束(例如,操作的数量是 O(1) 或 O(n),结果是相同的好像某事已完成)标准算法,而不是强制算法如何实现。
-
@SamVarshavchik 添加了该标签。感谢您的观看!
-
请注意,使用 Advance 而不是
[]可能会导致需要随机访问迭代器的算法意外地接受双向迭代器,从而导致编译并产生正确结果的代码,但性能很差。 (至少是前概念) -
@Curious “该库引入了类别标记类,这些类别标记类用作算法选择的编译时标记。”。我想说从
iterator<...>继承您的迭代器或专门化iterator_traits就足够了
标签: c++ algorithm c++11 iterator language-lawyer