迭代字符串(STL)

时间:2015-01-23 16:38:36

标签: c++ iterator std

我想迭代一个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不存在。

如果我正在执行递减迭代,我可以知道如何解决问题吗?

2 个答案:

答案 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代替ifdo ... 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 )