boost :: next和std :: next等效?

时间:2013-07-03 09:12:26

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

总的来说不是。可能是的,如果你将它用于迭代器(无论如何都是假定的用途)。

我一般说不的原因是,如果参数类不是迭代器,则第二个(默认)参数中的std::nextiterator_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可能是错误的。

答案 2 :(得分:0)

我刚刚将代码库更新为c ++ 11和最新版本。我更新了boost :: next到std :: next(与你想要的相反),没有任何负面影响。

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