list 带头双向循环。
list文档
insert 是在pos位置前面插入,pos是一个迭代器位置。
vector insert/erase 会失效
list insert 不会失效, erase 会失效
clear 不会清除哨兵位节点。
splice:splice可以在自己的链表上操作,也可以把别的链表的部分转移到这个链表上。splice = transfers 转移 把一个链表中某些节点转移到别的位置去。转移是把链表的某些部分转移到让它去的位置的后面。如果把 lt1 转移到 lt2 上面,则 lt1 就没有节点了。
链表的排序效率比较差,链表底层用的归并排序。数据量大不要使用 list 排序。
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
list<int>::iterator it = lt.begin();
while (it != lt.end())
{
cout << *it << " ";
it++;
}
cout << endl;
lt.reverse();
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
// lt.sort(greater<int>()) 仿函数 排降序。
lt.sort();
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
list<int> lt2;
lt.sort();
lt2.sort();
lt.merge(lt2); // lt和lt2都得有序才能合并在一起 merge:合并
// unique 去重
lt.sort();
lt.unique(); //去重前也得排序。
//remove 相当于find + erase 得先找到val才能去删除。
// splice = transfers 转移 把一个链表中某些节点转移到别的位置去
// 把lt的lt.begin() 这个节点转移到lt.end()这个位置去。
lt.splice(lt.end(), lt, lt.begin());
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
return 0;
}