2015-11-19 70 views
0

我不明白爲什麼我的代碼沒有插入到列表中。列表插入STL

但是,如果我通過執行push_back來更改我使用插入的行,那麼該元素將被插入到列表中。謝謝

但我必須有它排序。操作<被很好地落實:

void Movies::afegirPeliculaDirector(string director,string title,int year){ 
     list<actorDirectorMovie> llista; 
     actorDirectorMovie dir(title,year); 
     int total=_mapDirectors.count(director); 
     if (total>0){ 
      map<string,list<actorDirectorMovie> >::iterator     
      it=_mapDirectors.find(director); 
      llista=(*it).second; 
      list<actorDirectorMovie>::iterator itList=(*it).second.begin(); 
      while(itList!=(*it).second.end() and (*itList) < dir){ 
       itList++; 
      } 
      if (itList==(*it).second.end()) llista.push_back(dir); 
      else { 
       cout << llista.size() << endl; 
       llista.insert(itList,dir);//->>>>>>>>>>>>>>>>>>>> IT DOESN'T INSERT, WHY? 
       cout << llista.size() << endl; 
      } 
      it->second=llista; 
    } 
    else { 
     llista.push_back(dir); 
     _mapDirectors.insert(make_pair(director,llista)); 
    } 
    directorMovies(director); 
} 

回答

1

itList迭代器是指不同的容器。 itList指向_mapDirectors[director].second的成員,但您試圖將其用作llista的插入點。

我認爲問題在於你希望llista是對映射列表的引用,而是你正在複製它。

試試下面的代碼(我沒有測試過,但它應該給你的想法)。請注意,映射列表需要參考。也沒有必要測試一個空的地圖,或者爲導演做一個明確的find--你可以簡單地參考_mapDirectors[director].second,如果它還沒有在地圖中,空列表將自動創建。

void Movies::afegirPeliculaDirector(string director,string title,int year) 
{ 
    // get a reference to the director's list 
    list<actorDirectorMovie>& llista = _mapDirectors[director]; 
    actorDirectorMovie dir(title,year); 

    list<actorDirectorMovie>::iterator itList=llista.begin(); 
    while(itList!=llista.end() and (*itList) < dir){ 
     itList++; 
    } 
    if (itList==llista.end()) llista.push_back(dir); 
    else { 
     cout << llista.size() << endl; 
     llista.insert(itList,dir); 
     cout << llista.size() << endl; 
    } 
} 

你也可以考慮使用list每個導演的電影存儲到set改變,因爲這有你正在自動排序的屬性。在這種情況下,整個功能將減少到_mapDirectors[director].insert(dir)