通过向量迭代识别段落

时间:2013-01-15 05:22:30

标签: c++ vector loops

我现在已经进入了一本处理迭代器的书(C ++ Primer 5th Edition)。到目前为止看起来相当简单,但我遇到了一些小挑战。

在书中,问题是“......将与第一段相对应的 text [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'。

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

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

这是我提出的代码(在进行任何大写操作之前我想测试它是否可以读取段落)并且正在玩,但所有这些都打印了输入的最后一个单词。

#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;
}

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

1 个答案:

答案 0 :(得分: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
 }

我不知道这是否解决了你的整个问题,但它应该解决你所得到的错误。