列表插入STL
List Insert 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);
}
您的 itList
迭代器引用了不同的容器。 itList
指向 _mapDirectors[director].second
的成员,但您试图将其用作 llista
.
的插入点
我认为问题在于您希望 llista
成为映射列表的引用,但您却在复制它。
试试下面的代码(我还没有测试过,但它应该能让你明白)。请注意,它需要一个 reference 到映射列表。也不需要测试空地图,或为导演做一个明确的 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)
。
我不明白为什么我的代码没有插入到列表中。
但是如果我通过执行 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);
}
您的 itList
迭代器引用了不同的容器。 itList
指向 _mapDirectors[director].second
的成员,但您试图将其用作 llista
.
我认为问题在于您希望 llista
成为映射列表的引用,但您却在复制它。
试试下面的代码(我还没有测试过,但它应该能让你明白)。请注意,它需要一个 reference 到映射列表。也不需要测试空地图,或为导演做一个明确的 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)
。