我想迭代一个sting,从第一个元素到最后一个元素,但是当我执行以下代码时:
for (string::iterator i =beads.begin(); i != beads.end(); i++);
我无法到达最后一个元素。所以我把它改成了:
for (string::iterator i =beads.begin(); i <= beads.end(); i++);
编译器报告错误,说它不可递增,因为beads.end()+1
不存在。
我可以知道是否有任何优雅的方法来解决这个问题,以便我可以找到最后一个元素?
校正:
对不起,实际上,我正在执行递减操作。
我将其更改为增量操作只是为了让每个人都更容易看到。我忘记了beads.end()是一个过去的迭代器。
我实际上在使用for (string::iterator i =pos; i >= beads.begin(); i--);
。因为beads.begin()不是一个在开始之前的操作符,所以我不能使用for (string::iterator i =pos; i != beads.begin(); i--);
,否则我将永远不会到达第一个元素。
但是,编译器报告错误,因为beads.begin()-1
不存在。
如果我正在执行递减迭代,我可以知道如何解决问题吗?
答案 0 :(得分:1)
[编辑:感谢James Kanze建议使用现有的反向迭代器]
因为事实证明std::string
已经通过rbegin()
和rend()
方法提供反向迭代器,到目前为止最简单的方法是使用它们 - 如果你没有不需要在循环体中通常的“向前”方向访问从位置i
开始的字符串:
for (string::reverse_iterator i = beads.rend(); i != beads.rend(); ++i) {
...
}
如果失败,你可以使用
for (string::iterator ii = beads.end(); ii != beads.begin(); --ii) {
string::iterator i = ii - 1;
// Use i, NOT ii from now on
}
是的,这很难看。但唯一避免必须复制循环体的真正替代方法是引入一个特殊的finalIter
标志变量(就像混乱一样),或者更改为while
循环:
{
string::iterator i = beads.end();
while (i != beads.begin()) {
--i;
...
}
}
额外的括号是保持i
的范围;你可能不需要它们。 [编辑#2:正如James Kanze所注意到的,由于我们需要处理空字符串案例,我们可以使用while
代替if
加do ... while
。 ] 强>
答案 1 :(得分:0)
最好的解决方案可能仍然是使用反向迭代器:
for ( auto i = std::string::reverse_iterator( pos ); i != beads.rend(); ++ i ) {
// ...
}
这假设您不想迭代pos
;你呢
你必须确保它不是beads.end()
,然后
使用i
初始化std::string::reverse_iterator( pos + 1 )
。