5

私はC++の初心者です。次のプログラムは非常に単純ですが、「EXIT」を入力すると、前に入力した名前が出力されるはずなのに、プログラムが終了する理由がわかりません。

コードは次のとおりです。

#include <iostream>
#include <string>
#include <set> 

using namespace std;

int main()
{
  set <string> myset;
  set <string> :: const_iterator it;
  it = myset.begin();

  string In;
  int i=1;

  string exit("EXIT");

  cout << "Enter EXIT to print names." << endl;

  while(1)
  {
    cout << "Enter name " << i << ": " ;
    cin >> In;

    if( In == exit)
      break;

    myset.insert(In);
    In.clear();
    i++;
  }


  while( it != myset.end())
  {
    cout << *it << " " ;
    it ++ ;
  }

  cout << endl;
}

前もって感謝します。

4

3 に答える 3

4

挿入が完了したら、セットの先頭を再度決定する必要があります。

it = myset.begin();

while2番目のループの前に行く必要があります。


C ++ 11機能を使用できる場合は、範囲ベースのforループの使用を検討してください。イテレータを使用する必要がないことに注意してください。

for( auto const& value : myset )
  std::cout << value << " ";
std::cout << "\n";

C ++ 11機能を使用できない場合は、通常のforループを検討してください。イテレータのスコープがforループに制限されていることに注意してください。

for(std::set<std::string>::const_iterator it=myset.begin(), end=myset.end(); 
      it != end; ++it)
  std::cout << *it << " ";
std::cout << "\n";
于 2012-11-16T19:53:49.130 に答える
3
it = myset.begin();

この行を、名前を表示するループの直前に移動します。問題は、セットに要素がない上部にある場合、終了イテレータの値を取得するため、表示ループがすぐに終了することです。

于 2012-11-16T19:54:41.780 に答える
0

it == myset.end();true最初のwhileループの実行が完了した後に評価されます。ループの間にこのコード行を追加する必要がありますit = myset.begin();

于 2012-11-16T19:55:55.747 に答える