0

stdin を読み取り、vector と stdout に保存するこのコードをテストしています。

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


using namespace std;

int main() {
  vector<string> vs;
  vector<string>::iterator vsi;

  string buffer;
  while (!(cin.eof())) {
    getline(cin, buffer);
    cout << buffer << endl;
    vs.push_back(buffer);
  };

  for (int count=1 , vsi = vs.begin(); vsi != vs.end(); vsi++,count++){
    cout << "string" << count <<"="<< *vsi << endl;
  }

  return 0;
}



[root@server dev]# g++ -o newcode newcode.cpp 
newcode.cpp: In function ‘int main()’:
newcode.cpp:19: error: cannot convert ‘__gnu_cxx::__normal_iterator<std::basic_string<char, std::char_traits<char>, std::allocator<char> >*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >’ to ‘int’ in initialization
newcode.cpp:19: error: no match for ‘operator!=’ in ‘vsi != vs.std::vector<_Tp, _Alloc>::end [with _Tp = std::basic_string<char, std::char_traits<char>, std::allocator<char> >, _Alloc = std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >]()’
newcode.cpp:20: error: invalid type argument of ‘unary *’
[root@server dev]# 
4

3 に答える 3

4

forループの初期化部分で、vsi型が である新しい変数を宣言しますint

問題を解決する 1 つの方法:

vsi = vs.begin();
for (int count=1; vsi != vs.end(); ...
于 2012-10-17T12:35:57.937 に答える
1

問題はこの行にあります:

for (int count=1 , vsi = vs.begin(); vsi != vs.end(); vsi++,count++)

との 2 つのint変数を定義します。次に、で秒を割り当てようとします。これは、コンパイラが不平を言うものです。countvsivs.begin()

于 2012-10-17T12:37:23.477 に答える
0

問題は、vs.begin() が int を返さず、vsi を整数として宣言したことです。

簡単な修正:

for (int count=0;count < vs.size(); ++count){
  cout << "string" << (count+1) <<"="<< vs[count] << endl;
}

ノート:

  • この場合は違いはありませんが、違いがある場合があり++countます。 ですから、身につけるのは良い習慣です。 参照: ++iterator と iterator++ のパフォーマンスの違いは?count++


  • while (!(cin.eof()))事実上常に間違っています (すべての言語で)。
    「eof フラグ」は、eof を読み終えるまで true に設定されません。
    最後に成功した読み取りは、eof まで (ただし過去ではない) を読み取ります。したがって、最後にループに入ると、読み取りは失敗しますが、それでも値をベクトルにプッシュバックします。

    • 場合によっては、これにより無限ループが発生する可能性があります。
      読み取り時に別のタイプのエラーが発生した場合、eof に到達することはありません
      (例: cin >> x; 入力が整数でない場合、x は int である場合に失敗する可能性があり
      ます) 。
于 2012-10-17T13:13:24.473 に答える