【问题标题】:boost::next and std::next equivalent?boost::next 和 std::next 等效?
【发布时间】:2013-06-30 21:50:02
【问题描述】:

我有一个要求,我想查看下一个迭代器位置,看看它是否是容器的结尾。我不能使用std::next,因为 C++11 还没有被采用。我可以使用boost::next 作为替代方案吗?谢谢

【问题讨论】:

  • 标准库中的许多新的 C++11 特性都是根据它们的 Boost 等价物建模的。因此,无需查看任何文档,我就会说它应该可以工作。
  • boost::nextstd::next。所以是的。
  • 你尝试的时候发生了什么?文档是怎么说的?
  • @gx_ 这是最好的答案。可惜是评论

标签: c++ boost c++11 stl iterator


【解决方案1】:

我刚刚将代码库更新为 c++11 和最新的 boost。我将 boost::next 更新为 std::next (与您想要的相反)没有负面影响。

所以可能的答案是肯定的。

【讨论】:

    【解决方案2】:

    一般来说没有。如果您将它用于迭代器,可能是的(无论如何这是假定的用途)。

    我一般说不的原因是,如果参数类不是迭代器,则在第二个(默认)参数中的 std::next (iterator_traits<...>) 中存在替换错误。因此,过去适用于 boost::next 的东西可能不再适用于 std::next

    例如,我曾经将boost::next 用于不是迭代器但定义了operator++(但没有二进制+ 运算符)的类。通常我想生成下一个元素,boost::next 非常适合。

    struct myint{
      int impl;
      myint& operator++(){impl++; return *this;}
    }
    

    boost::next 适用于此类,但 std::next 不适用。所以,我必须坚持复制并增加或回退到boost::next(或者更糟糕的是,为不是迭代器的东西生成iterator_trait)。

    我对@9​​87654333@ 的问题是第二个参数(与difference_type 相关)对参数施加了不必要的限制。但是我可能是滥用函数::next的错误。

    【讨论】:

    • OP 专门讨论将其用于迭代器
    【解决方案3】:

    如果它没有按预期工作,我会感到惊讶。如有疑问,您可以随时使用std::advance

    some_container c;
    some_container::iterator it;
    std::advance(it, 1);
    bool b = it == c.end();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 2013-02-07
      • 2016-11-13
      • 2021-08-30
      • 2014-02-02
      • 1970-01-01
      相关资源
      最近更新 更多