3

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

4

3 回答 3

1

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

some_container c;
some_container::iterator it;
std::advance(it, 1);
bool b = it == c.end();
于 2013-07-03T09:16:58.530 回答
0

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

我一般说不的原因是,如果参数类不是迭代器,则在第二个(默认)参数中的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是,为不是迭代器的东西生成一个)。

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

于 2013-10-06T09:52:48.823 回答
0

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

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

于 2018-04-20T08:31:47.167 回答