2016-07-29 9 views
0

編集:私を助けてくれてありがとう。しかし、私は再び私の質問にdownvotesを取得しています。私の質問がひどく句読めされていたら、すみません。私は可能な限り分かりやすくしようとしました。再度、感謝します。ランニングコードのランタイムエラー

名前のリストにカップルを見つけるコードを書いています。

はカップルが常に同じ正確な接頭辞があり、女の子が接尾辞"ki"を持っているのに対し、少年は接尾 "ka"を持っています。

例: "bipinka"と "bipinki"はカップルです。

質問では、 の次の行には、スペースで区切られた文字列のリストによって、N(名前の数)が続きます。

私の論理は、各名前の最後の2文字を確認することです。 "ka"の場合は、最後の2文字を削除してと同様にkaベクターに追加します。その後、私は単純に等価チェックを行い、等価であれば、3つの"bipinka"が1つの"bipinki"をその仲間として共有できないため、それらをベクトルから削除します。次のように

私のコードは次のとおり

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

#define sd(n) scanf("%d", &n) 
#define slld(n) scanf("%lld", &n) 
#define slf(n) scanf("%lf", &n) 
#define pd(n) printf("%d\n", n) 
#define plld(n) printf("%lld\n", n) 
#define plf(n) printf("%lf\n", n) 
using namespace std; 

int main() { 
    int N, i, j; 
    string names[1001]; 
    vector<string> ka, ki; 
    sd(N); 
    for(i=0;i<N;i++) 
    { 
     cin >> names[i]; 
     cout << names[i] << " "; //Entered this to check for error. 
     string lastTwo = names[i].substr(names[i].size()-2); 
     string name = names[i].substr(0, names[i].size()-2); 
     if (lastTwo == "ka") 
     { 
      ka.push_back(name); 
     } 
     else if (lastTwo == "ki") 
     { 
      ki.push_back(name); 
     } 
    } 
    int ctr = 0; 
    for(i=0; i<ka.size();i++) 
    { 
     for(j=0;j<ki.size(); j++) 
     { 
      if(ka[i] == ki[j]) 
      { 
       ka.erase(ka.begin() + i - 1); 
       ki.erase(ki.begin() + j - 1); 
       ctr++; 
      } 
     } 
    } 
    cout << ctr<<endl; 
    return 0; 
} 

問題は、このセグメントのどこかにある:

for(i=0;i<N;i++) 
{ 
    cin >> names[i]; 
    cout << names[i]; //Entered this to check for error. 
    string lastTwo = names[i].substr(names[i].size()-2); //last two letters of name 
    string name = names[i].substr(0, names[i].size()-2); //name without last two letters 
    if (lastTwo == "ka") 
    { 
     ka.push_back(name); //Pushing in ka vector 
    } 
    else if (lastTwo == "ki") 
    { 
     ki.push_back(name); //Pushing in ki vector 
    } 
} 

所与の入力の場合:

6 
bipinki bipinka bipinka bipinka betiki betika 

マイcout機能のみを出力します:

bipinki bipinka bipinka bipinka betiki 

そしてコードはRun Time Error - Out of Range.に遭遇します。私はこれは私が見誤りであるオンラインIDEを使用しています: enter image description here

+1

"_実行時エラー' _が発生しました。エラーとは何ですか? –

+0

上記を参照してください。それは私のIDEで教えてくれません –

+0

あなたの 'ki'と' ka'を保存するために 'unordered_set'を使わないのはなぜですか?O(n^2) –

答えて

5

あなたの問題は、あなたが同じ配列を反復している中に配列から消去されていることです。

このオンラインIDEでデバッグすることはできません(VS Community 2015をダウンロードすることをお勧めします)。ペンと紙を持っている場合は、値を書き留めて反復してから、途中で1つの要素を消去します。

何が起こりますか?ループが範囲外になります。これはループの範囲が0 -> 5とし、ループ中にとし、1つ(またはそれ以上)の要素が配列から消去されたために発生します。さて、あなたの配列は0 -> 4ですが、あなたのループは-> 5 ..サプライズ到達し続ける傾向があります:

ランタイムエラーを - 範囲外です。

+0

要素とループをもう一度削除する必要がありますか、単に要素を ""に置き換える必要がありますか? ""が見つかった場合は、それを私の繰り返しでスキップします。 –

+0

どうもありがとう。 –

+1

私たちが手伝ってくれてうれしいです:) –