1

イテレータを扱う本 (C++ Primer 5th Edition) のセクションに入りました。これまでのところ、かなり単純に見えますが、いくつかの小さな課題があります。

本では、質問は「...最初の段落に対応するテキスト[ベクトル]の要素をすべて大文字に変更し、その内容を出力する」と尋ねています。

私が抱えている最初の問題は、本の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 に答える