我现在已经进入了一本处理迭代器的书(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;
}
一如既往,感谢您的帮助!
答案 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
}
我不知道这是否解决了你的整个问题,但它应该解决你所得到的错误。