在c ++中向后迭代

时间:2013-04-27 18:34:47

标签: c++ for-loop iteration

我的印象是以下代码会打印出“hello world”,但它根本不会打印任何内容。为什么? 使用g ++ 4.2.1和cl ++ 3.2编译。

void iterateBackwards(){
    std::string hiThere = "dlrow olleh";
    for ( int i = hiThere.length(); i == 0; i--) {
        std::cout << hiThere[i];
    }
}

4 个答案:

答案 0 :(得分:5)

您的情况应为i >= 0,而不是i == 0(条件为for后,false循环退出,这在您的示例中就是这种情况。

此外,一旦解决了这个问题,你应该将赋值修复为i,因为下标运算符接受从零开始的索引;这意味着当i == hiThere.length()你将访问字符串的终止符时,你可能对输出没兴趣。

这应该更好:

void iterateBackwards(){
    std::string hiThere = "dlrow olleh";
    for ( int i = hiThere.length() - 1; i >= 0; i--) {
        std::cout << hiThere[i];
    }
}

这是live example

答案 1 :(得分:2)

  1. 循环中的条件必须为i >= 0。否则程序将永远不会进入循环体 - 只要i == 0为真,它就会循环,并将i设置为字符串的长度。
  2. i应使用hiThere.length() - 1进行初始化。否则你将有未定义的行为 - C ++中的字符串和数组是0索引的,即第一个索引是0,最后一个是size - 1(所以hiThere[hiThere.length() - 1]是{{的最后一个元素1}})。
  3. 您应该查看C ++迭代器:

    hiThere

答案 2 :(得分:1)

@AndyProwl已经提供了一个解决方案,我将在这里复制以便于与我的比较:

std::string hiThere = "dlrow olleh";
for ( int i = hiThere.length() - 1; i >= 0; i--) {
    std::cout << hiThere[i];
}

为了完整起见,你也可以这样写(并且因为你可能会遇到它而值得知道这个形式 - 请注意它完全等同于Andy的解决方案):

std::string hiThere = "dlrow olleh";
for (size_t i = hiThere.length(); i--; ) {
    std::cout << hiThere[i];
}

一些评论:

  • 我们现在可以使用unsigned(size_t)索引,因为我们不再需要负值。这很有趣,因为如果你的字符串长于INT_MAX,Andy的解决方案会发生什么? (这是不太可能发生的,我会批准你,但仍然......)这种形式解决了这个小的(实际上,迂腐的)困境。
  • 终止条件和事后的想法合并在一起,因此事后的想法是空的。
  • 与我们习惯的大多数for循环不同,这里使用后递减运算符而不是通常的预递减运算符非常重要,整个事情都依赖于它。

但老实说,我更喜欢@ woytaz的迭代器解决方案,因为它与STL的其余部分更加一致。

答案 3 :(得分:0)

此外,你在for循环中的条件应该是

i >= 0

而不是

i == 0

这是因为for循环只要为真就会迭代,如果使用i == 0,它将为FALSE。