2016-09-29 19 views
1
#include "stdafx.h" 
#include <iostream> 
#include <vector> 
#include <algorithm> 
#include <string> 
#include <iomanip> 
using namespace std; 

vector<string>::iterator findString(vector<string> word, string x) 
{ 
auto beg = word.begin(); 
for (; beg != word.end() && x != *beg; beg++); 
return beg; 
} 

vector<int>::iterator convert(vector<string>::iterator &t, vector<string> &word, vector<int> &amount) 
{ 
vector<int>::iterator count = amount.begin(); 
vector<string>::iterator beg = word.begin(); 
for (; beg != word.end() && beg != t; count++, beg++); 
return count; 
} 
int main() 
{ 
vector<string> word; 
vector<int> amount; 

string x; 

cout << "Please enter words list:" << endl; 

cin >> x; 
word.push_back(x); 
amount.push_back(1); 

while (cin >> x) 
{ 
     vector<string>::iterator t = findString(word, x); 

     if (t != word.end()) //A: Error happens in this line. 
     { 
      vector<int>::iterator i = convert(t,word,amount); 
      (*i) ++; 
     } 
     else 
     { 
      word.push_back(x); 
      amount.push_back(1); 
     } 
} 

for (auto r : word) 
    cout << setw(4) << r; 
cout << endl; 

for (auto r : amount) 
    cout << setw(4) << r; 
cout << endl; 

return 0; 
} 

このプログラムでは、各単語の入力数をカウントしたいと考えています。 文字列反復子からint反復子への変換関数を書きました。しかし、それはまだ動作しませんし、イテレータは互換性がないと言います。何か間違っていますか?さらに、なぜ反復子が対応する整数に変換できないのか混乱しています。そしてなぜ 'ptrdiff_t'があるのですが、それがちょうど 'int'ならもっと簡単になりませんか? 私はこのウェブサイトを初めて使用します。誰かが私の質問に答えることができれば、私は感謝しています。ありがとう。イテレータは互換性がないのはなぜですか?

- 2つの文字列を入力した後の実行時エラーです。デバッグアサーションに失敗しました。ファイル:ベクトル、行248.式:ベクトル反復子は互換性がありません。私はVS2015で走った。

- ラインAでエラーが発生します。

最終的にわかります。みんな、ありがとう。本当にありがとう、よかったです。

+2

「動作しません」というエラーが表示されますか?投稿する。 –

+0

イテレータは互換性がないと言われています。 –

+0

どのようなエラーが表示されますか? – Galik

答えて

1

あなたのエラーは文字列やintやコンバージョンとは関係ありません。これは、findStringを呼び出すたびにvector<string> wordの新しいコピーを作成しているため、返されるイテレータは別のベクトルのイテレータ(コピーのイテレータ)です。後で、その後

vector<string>::iterator findString(vector<string> word, string x) 
{ 
    ... 
} 

そして、エラーは次のとおりです:あなたは持っている

vector<string>::iterator t = findString(word, x); 

if (t != word.end()) //A: Error happens in this line. 

そしてそうfindStringではなく、単語自体の単語のコピーに反復子を返して、そしてMS」ベクトルの実装がありあなたが間違いを犯した可能性が最も高いと考えられるため、別のベクトルのイテレータと比較しようとするとアサーションの失敗が発生します。代わりに、参照によってベクトルを渡します。

vector<string>::iterator findString(vector<string> & word, string x) 
{ 
    ... 
} 

ここで言葉は参照によって渡されるため、コピーされません。

しかし、最初に練習としてエラーを修正する必要がありますが、独自のコードを作成したら、を(既に存在するので)std::findに置き換えることを検討してください。また、単語数を維持するためにmap<string,int>を使用することでコードを大幅に簡略化できるようです。他にもいくつかあります。

0

これら2つのタイプは単純に異なり、一方を他方に変換することはできません。それらは「整数」ではなく、コンテナ内の位置を抽象化します。

あなたの実際の問題は、あなたのfindStringがあなたの単語ベクトルのコピーに対してイテレータを返すためです。そのイテレーターをword.end()と比較すると、2つのイテレーターは異なるコンテナーに関連しており、VC STLは正当に問題を起こします。開始のために参照によってベクトルを受け入れます。

関連する問題