1

我现在进入了一本关于迭代器的书(C++ Primer 5th Edition)的一部分。到目前为止,这似乎相当简单,但我遇到了一些小挑战。

在书中,问题要求“......将文本[a vector] 中与第一段相对应的元素更改为全部大写并打印其内容。”

我遇到的第一个问题是,在本书的第 110 页上,它提供了示例代码,用于识别向量中是否有一个表示段落结尾的空元素。代码如下,来自书中:

// print each line in text up to the first blank line
    for (auto it = text.cbegin(); it != text.cend() && !it->empty(); ++it);
    cout << *it << endl;

但是,当我在编辑器中输入这个时,我收到一个错误,指的是 *it 说:使用未声明的标识符 'it'。

如果我想创建一个向量文本并从输入中读取元素,然后运行一个迭代器来检查是否有段落结尾,然后将整个段落大写并打印结果,我该怎么做?

我以为我知道,但是只要我输入示例代码,它就会出现上述错误。

这是我提交的代码(在进行任何大写之前,我想测试它是否可以读取段落)并且正在使用,但这所做的只是打印最后输入的单词。

#include <iostream>
#include <string>
#include <vector>

using std::string; using std::vector; using std::cout; using std::cin; using std::endl;

int main ()
{
    const vector<string> text;
    string words;

    while (cin >> words) {
        for (auto it = text.cbegin(); it != text.cend() && !it->empty(); ++it);
    }
    cout << words << endl;
}

一如既往地感谢您的帮助!

4

1 回答 1

3

您将迭代器声明为 for 循环的本地,但您在循环后放置了一个分号,因此该行cout << *it << endl;不是循环的一部分,并且变量it不在范围内。只需删除分号就可以了:

 for (auto it = text.cbegin(); it != text.cend() && !it->empty(); ++it)//no semicolon here
    cout << *it << endl;

为了更好地说明发生了什么,这里有一对带大括号的例子:

 //your original code:
 for (auto it = text.cbegin(); it != text.cend() && !it->empty(); ++it)
 {

 }
 cout << *it << endl; //variable it does not exist after the for loop ends

 //code that works:
 for (auto it = text.cbegin(); it != text.cend() && !it->empty(); ++it)
 {
          cout << *it << endl; //what happens _unless_ you put a ; after the loop statement
 }

我不知道这是否可以解决您的整个问题,但它应该可以解决您遇到的错误。

于 2013-01-15T05:31:10.660 回答