【问题标题】:Do C++ standard library algorithms use std::advanceC++ 标准库算法是否使用 std::advance
【发布时间】: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_boundstd::lower_bound 在大多数实现中经常使用std::advance 来推进迭代器n 步骤
  • 标准描述了工作上的约束(例如,操作的数量是 O(1) 或 O(n),结果是相同的好像某事已完成)标准算法,而不是强制算法如何实现。
  • @SamVarshavchik 添加了该标签。感谢您的观看!
  • 请注意,使用 Advance 而不是 [] 可能会导致需要随机访问迭代器的算法意外地接受双向迭代器,从而导致编译并产生正确结果的代码,但性能很差。 (至少是前概念)
  • @Curious “该库引入了类别标记类,这些类别标记类用作算法选择的编译时标记。”。我想说从iterator<...> 继承您的迭代器或专门化iterator_traits 就足够了

标签: c++ algorithm c++11 iterator language-lawyer


【解决方案1】:

该标准没有明确指定 C++ std 算法的实现。它指定行为,有时还指定特定操作完成的次数。这可能使实施者几乎没有实际的选择,但没有明确指定。

std::advance 据我所知,在标准中从未被称为由另一种算法调用。这意味着它可以在特定算法的特定实现中使用或不使用。

指定std::advance 的效果。只要其他算法指定它们的操作计数,为了调用std::advance,它不能破坏它们的保证。

简而言之,使用它是允许的,不是必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多