簡體   English   中英

為什么迭代器不返回到集合的開頭?

[英]Why does the iterator not return to the beginning of the set?

我用C ++編寫了一個程序來幫助我學習GMAT。 我用它來練習隨機表最多25個時間表。 它的工作原理是生成一個隨機數,並要求用戶將該數字乘以他們要處理的時間表。 該程序將該數字添加到集合中,以使其不再重復。 請在下面找到代碼:

int randumb(int a){
  random_device rd;
  mt19937 gen(rd());
  uniform_real_distribution <> dis(1,a+1);
  int u=dis(gen);
  return u;
}

void mult_tables(){
  cout<<"Which times table would you like to practice?"<<endl;
  int a, input;
  set<int> vect;
  cin>>a;
  int mult;
  for(int i=0; i<a; ++i){
    mult=randumb(a);
    if(i==0)
      vect.insert(mult);
    if(i!=0){
      for(set<int>::iterator it=vect.begin(); it!=vect.end(); ++it){
        if(mult==*it){
          mult=randumb(a);
          it=vect.begin();
        }
      }
      vect.insert(mult);
    }
    cout<<endl;
    cout<<a<<" x "<<mult<<" = ";
    cin>>input;
    if(input==a*mult)
      cout<<"Correct!"<<endl;
    else
      cout<<"Wrong."<<endl;
  }
} 

如您所見,該代碼將每個乘數與集合中已存在的元素進行比較。 如果集合中已經有一個數字,它將生成新的數字,並將迭代器返回到集合的開頭,以便它可以將新的乘數與所有先前使用的數字進行比較。 我逐步瀏覽了GDB中的程序,並在每次it=vect.begin();該程序時執行it=vect.begin(); 它將迭代器返回到集合中的SECOND元素。 每次都會發生,並導致數字重復。 有人知道為什么會這樣嗎?

邏輯錯誤是您在循環中調用vect.begin()之后增加了迭代器。

您需要的是:

  for(set<int>::iterator it=vect.begin(); it!=vect.end(); /** ++it **/){
    if(mult==*it){
      mult=randumb(a);

      // Reset the iterator to the start.
      // Don't increment it.
      it=vect.begin();
    }
    else {
     // Increment the iterator.
     ++it;
    }
  }

這不是您的實現的解決方案,而是一種更干凈的方法來完成相同的事情。

集合容器可確保其中的每個值都是唯一的,因此,只要檢查集合的大小小於要求的數量,就不用檢查數字是否已存在,而僅添加數字會更容易。

這是一個代碼片段:

std::set<int> nums;
while(nums.size() < REQUIRED_SIZE)
{
    nums.insert(randumb(a));
}

此時,您有一組唯一的數字,可以根據需要使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM