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();

应该在第二个while循环之前进行。


如果您能够使用 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 回答