我的问题如下:我使用迭代器,我想将每个元素与下一个元素进行比较。原型如下所示,如何增加迭代器才能进行比较? 另外,我怎样才能为此设置一个合适的条件?我的意思是如何指向最后一个元素,而不是在最后一个元素之后使用end()函数:
std::vector<T>::const_iterator it;
std::vector<T>::const_iterator it2;
for (it = set.begin(), it != set.end(); it++)
{
// some things happen
if ( final == it )
{
if ( it != set.end()-1 ) // how to write properly condition?
{
it2 = it + 1; //how to assign the next here?
if (...)//some condition
{
if ( it->func1() - it2->func1()) < 20 ) //actual comparison of two consecutive element values
// do something
}
}
}
}
答案 0 :(得分:3)
在 C ++ 11 中使用函数std::next()和std::prev()。
您的代码可能会变成:
// before
it != std::set.end()-1
// after
it != std::prev(set.end())
和
// before
it2 = it + 1;
// after
it2 = std::next(it);
对于非矢量容器也是如此,例如map,set或其他容器。
注意:在std::next(it)
之后,&#34;它&#34;迭代器保持不变!
注2:使用it2 = std::next(it,n);
根据需要增加。
答案 1 :(得分:2)
您可以使用adjacent_find来解决这个问题。你应该使用该函数的第二种形式(带谓词)并将c {tor中的some things happen
和some condition
传递给谓词
auto found = std::adjacent_find( set.begin(), set.end(),
[some_comdition]( const T & left, const T & right ) {
if ( some_comdition ) {
if ( left.func1() - right.func1() < 20 ) {
do_smth();
// return true; if there's no need to continue
}
}
return false;
}
);
答案 2 :(得分:1)
基于it++
可接受的事实,我们应该定义一个名为itplusone
的新迭代器,它被初始化为itplusone = ++it
。通过这种方式,您可以安全地使用指向it
的下一项的迭代器的含义。同样很明显,itplusone
的迭代器范围由术语itplusone != set.end()
限定。我使用此方法计算路径的总权重,该路径定义为列表对象。
答案 3 :(得分:0)
有点晚了,才发现它,但是就像上面提到的,++迭代器可以正常工作。
.docx
答案 4 :(得分:-1)
在for
循环中,您使用it++
,这意味着it = it + 1
,这是完全正常的。所以这个也可以it2 = it + 1
。 it2
将指向下一个值。
再次在for
循环中,您使用it != set.end()
,这也完全可以。所以您也可以it + 1 < set.end()
,就像您在代码中所做的那样。
我的代码中没有任何错误,只是想解释一下。