2016-11-17 13 views
1

私は以下のコードを持っています。与えられたファイル内の与えられた文字の繰り返し数を数えることになっています。しかし、私はこれを実行しようとすると、範囲外のベクトルの下付き文字を取得します。同じエラーを持つ他の人は、未定義の部分にアクセスしようとしていましたが、これは問題ではないようです。範囲外のベクトル下付き文字 - 構造体のベクトル

struct letters 
{ 
    char letter; 
    int repetitions=0; 
}; 


void howManyTimes(const string &output) 
{ 
    ifstream file(output); 
    vector <letters> alphabet; 

    for (int i = 0; i < 'z' - 'a' + 1; i++) 
    { 
     alphabet[i].letter = 'a' + i; 
    } 

    string line; 

    while (file.eof() == 0) 
    { 
     getline(file, line); 
     for (char c : line) 
     { 
      if(c >= 'a' && c <= 'z') 
       alphabet[c - 'a'].repetitions++; 
      else if (c >= 'A' && c >= 'Z') 
       alphabet[c - 'A'].repetitions++; 
     } 
    } 
    cout << alphabet[10].repetitions; 
} 
+1

ベクトルで要素を埋めていますか? – UnholySheep

+1

これを使用するには、ベクターを初期化する必要があります。そうでなければ、 'operator []'の代わりに 'push_back( 'a' + i)'を使って値を代入します。 –

+0

一意のアイテムの出現数を検索するには、実際には 'std :: map'を使用する必要があります。 – NathanOliver

答えて

2
vector <letters> alphabet; // (1) 

for (int i = 0; i < 'z' - 'a' + 1; i++) 
{ 
    alphabet[i].letter = 'a' + i; // (2) 
} 

(1)ベクターを作成します。あなたはベクトルでインデックスiを使用してアイテムにアクセスしようとするので、明確にあなたのインデックスが範囲のうちある(2)forループ内

まず、ベクターにデータを入力してから、このデータにアクセスする必要があります。

あなたはベクトルに新しいアイテムを追加したい場合は、(あなたが(2)に何を意味するのか、おそらくです)vector::push_backを使用することができます。

0

同じエラーを持つ他の人は、未定義の部分にアクセスしようとしていましたが、これは問題ではないようです。

それは間違いなくここで問題です:

vector <letters> alphabet; // Now size of the vector is 0. 

for (int i = 0; i < 'z' - 'a' + 1; i++) 
{ 
    // You are trying to access elements 0, 1, 2, ..., which do not exist. 
    alphabet[i].letter = 'a' + i; 
} 

最も簡単な解決策は、適切なサイズを使用して、ベクターを構築することである。

vector <letters> alphabet('z' - 'a' + 1); 
+0

'' z ' - ' a''はシステムでは動作しません。これは、ASCIIエンコーディング(すべてのシステムの大部分です)を使用するシステムで動作しますが、本当に移植性がありません。 –

+0

それは働いている!しかし、それは '' z ' - ' a '+ 1' でなければなりませんでした。もしこれが間違っていたら '(c> =' A '&& c> =' Z ')'記号は 'c <'Z''でなければなりません –

0

私はあなたのコード場所の一部が表示されませんalphabetは、そこに保存する予定のオブジェクトに対応するように展開されます。 std::vectorは、push_backinsertemplaceまたは他の同様の方法を使用する場合にのみリサイズされます。 operator[]メソッドを使用して直接アクセスするときはそうしません。

いずれにせよ、このようなタスクでは、std::map<char, int64_t>がきれいになり、の構文を保持できるようにすると、ベクターを使用したいとは思えません。を追加メンテナンスを必要とせずに使用できます。

void howManyTimes(const string &output) 
{ 
    ifstream file(output); 

    map<char, int64_t> alphabet; 

    string line; 

    while (getline(file, line)) 
    { 
     for (char c : line) 
     { 
      if(c >= 'a' && c <= 'z') 
       alphabet[c - 'a']++; 
      else if (c >= 'A' && c >= 'Z') 
       alphabet[c - 'A']++; 

     } 
    } 
    cout << alphabet[10]; 

} 
+0

少なくともループ状態が間違っていることに注意してください。再現する場合は –

+0

@LightnessRacesinOrbit私は正直に気付かなかった。コードをコピーして、私が集中していたものに変更を加えました。私はそれを解決します。 – Xirema

0

このプログラムは、(私は宿題:)としてそれを与えたとき、私の生徒たちがどう感じたか、私は思ってしまう)何の質問が求めているため、本当に強力です。あなたは構造体を使用する必要がありますか?のがないと仮定しましょう、そしてまた、我々は、アルファベットの大きさを知っている、と「」最初の文字と「Z」であるとすると、最後の文字であると仮定します。

vector<int> repetitions(26, 0); 
char nextCharacter; 
while(!file.eof()) 
{ 
    cin >> nextCharacter; 
    nextCharacter = tolower(nextCharacter); 
    if(nextCharacter >= 'a' && nextCharacter <= 'z') 
    { 
     repetitions[nextCharacter - 'a']++; 
    } 
} 

手紙を確認するには:

cin >> letterToQuery; 
cout <<"The amount of occurrences of " << letterToQuery <<" is "; 
cout << repetitions[tolower(letterToQuery) - 'a'] << endl; 

あなたは、にコードの変更あなたのアルファベットのサイズがわからない場合:あなたは、その構造体を使用する必要がない場合は、

vector<int> repetitions('last_alphabet' - 'a' + 1, 0); 
... 
if(nextCharacter >= 'a' && nextCharacter <= 'last_letter') 

そして最後に、あなたのコードの変更へ:

struct Letter 
{ 
    char letter; 
    int repetitions=0; 
}; 

vector<Letter> alphabet; 
letter temp; 
for(int i = 0; i < 'last_alphabet' - 'a' + 1; ++i) 
{ 
    temp.letter = 'a' + i; 
    alphabet.push_back(temp); 
} 

// then everything else is a similar structure 
char nextCharacter; 
while(!file.eof()) 
{ 
    cin >> nextCharacter; 
    nextCharacter = tolower(nextCharacter); 
    if(nextCharacter >= 'a' && nextCharacter <= 'last_alphabet') 
    { 
     alphabet[nextCharacter - 'a'].repetitions++; 
    } 
} 

手紙をチェックするために:

cin >> letterToQuery; 
cout <<"The amount of occurrences of " << letterToQuery <<" is "; 
cout << alphabet[tolower(letterToQuery) - 'a'].repetitions << endl; 

お知らせを、あなたは 'Z' と 'last_alphabet' を交換する場合、あなたは現在のアルファベットを取得します。

関連する問題