2015-11-19 72 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)