2015-05-26 30 views
3

這是一個關於一輛汽車在十字路口進入隊列的故事。如何使用迭代器更改for循環中對象的屬性?

因此,對於每條道路,都有不同的車道(迭代器it),並且對於每個車道,都有不同的車輛(迭代器it2)。

void function(Road& R, int timestep) { 

    vector<int> lane = R.void1() { 
    for(vector<int>::iterator it = lane.begin() ; it != lane.end() ; it++) { 

     vector<Car> cars = R.void2((*it)); 
     for(vector<Car>::iterator it2 = cars.begin() ; it2 != cars.end() ; it2 ++) { 

      if((*it2).get_travel_time() >= R.get1((*it)) 
        (*it2).init_travel_time(); 
      else 
        (*it2).incr_travel_time(timestep); 
     } 
    } 
} 

init_travel_time其中套(*it)travel0並且其中incr_travel_time(timestep)timestep遞增相同的屬性,travel,的(*it)

我看到的問題是汽車的副本(*it2)遞增,但不是行R.void2((*it))中的汽車。

相反,對車直接增加,我想:

void function(Road& R, int timestep) {  
    for(vector<int>::iterator it = R.void1().begin() ; it != R.void1().end() ; it++) {  
     for(vector<Car>::iterator it2 = R.void2((*it)).begin() ; it2 != R.void2((*it)).end() ; it2 ++) { 

       if((*it2).get_travel_time() >= R.get1((*it)) 
         (*it2).init_travel_time(); 
       else 
         (*it2).incr_travel_time(timestep); 
      } 
     } 
    } 

,但我得到了以下錯誤:

vector iterator incompatible

這是可以理解的(Vector Iterators Incompatible)。

事實是,我認爲只要我的向量不能是const(我改變它的屬性),只要第二個答案讓我回到我的第一個命題,我就不能使用答案。

+0

請給我們一個更詳細的錯誤日誌。 btw:記住'(* ptr).'等同於'ptr->' – dlavila

+0

可能你的'R.void1()'和'R.void2((* it))'這兩種方法都會返回拷貝,正在迭代對象的副本。你的代碼真的很髒。請顯示這種方法的實現。 –

+0

@VictorPolevoy:我對C++和autodidact很新穎。所以我很樂意理解爲什麼我的代碼很髒,以及有什麼方法可以使它更好(實際上,下面的'function','void1','void2' ...沒有這樣的名字) –

回答

3

要改變包含在道路實際載體和避免產生副本,在你的第一個版本創建的向量引用:

void function(Road& R, int timestep) { 

    vector<int>& lane = R.void1(); 
    for(vector<int>::iterator it = lane.begin() ; it != lane.end() ; it++) { 

     vector<Car>& cars = R.void2(*it); 
     for(vector<Car>::iterator it2 = cars.begin() ; it2 != cars.end() ; it2 ++) { 

      if(it2->get_travel_time() >= R.get1(*it)) 
        it2->init_travel_time(); 
      else 
        it2->incr_travel_time(timestep); 
     } 
    } 
} 

此外,void1和void2應返回引用(如果他們不是)

vector<int>& Road::void1(); 
vector<Car>& Road::void2(int lane); 

我還刪除了代碼中的多餘括號以簡化閱讀。