简介
链表:是一种链式存储方式,上一个元素的数据域指向下一个元素的指针域。STL中的list是一个双向循环链表。
list与vector的区别
1.链表是不支持随机存取(不能使用at或list[i])
//vector可以通过以下方式进行随机访问,list则不行
v1[i]; v1.at(i);
//vector可以通过以下方式进行随机插入,list则不行,但可使用自增运算符
v1.insert(v1.end()-2,1);
l1.insert(++l1.begin(),1);
2.插入和删除都不会造成原有的迭代器失效,这在vector中不行!!!
//list可以通过一个迭代器进行多次插入删除,下一次在上一次的基础上进行
list<int> l1={10,20,30};
list<int>::const_iterator it1 = l1.begin();
l1.insert(++it1,1); //输出10,1,20,30
l1.insert(++it1,2); //输出10,1,20,2,30
//vector进行多次插入会导致迭代器失效,且不会报错!
//这里第二次插入将不知道插入到哪里去了
vector<int>::const_iterator it1 = v1.begin();
v1.insert(++it1,1);
v1.insert(++it1,21); //出错,但可编译
list优点:
- 不浪费存储
- 插入删除的效率高,不需要大量移动元素
list缺点:
- 占用空间更多,遍历开销大
无法使用迭代器进行随机插入,如下:
构造函数
list<int> l1;
list<int> l2<l1>;
lsit<int> l2(l1.begin(),l1.end())
list<int> l3(10,20);
l2 = l1;
逆向迭代器
list<int>::reverse_iterator it2 = list1.rbegin() ;
for (; it2 != list1.rend(); it2++)
{
cout << *it2 << "\t";
}
赋值操作
l2.assign(l1.begin(),l1.end());
l2.assign(10,20);
l1.swap(l2); //互换元素
l.push_back(ele);
l.pop_back();
l.push_front(ele); //vector无此操作
l.pop_front(ele);
l.insert(pos,ele);
l.insert(pos,n,ele);
l.insert(pos,beg,end);
l.clear();
l.erase(pos);
l.remove(ele); //删除所有与ele匹配的元素
大小操作
l.size();
l.empty();
l.resize(num);
l.resize(num,ele); //若容器变长,以ele填充
数据存取(不支持随机存取)
l1.front() //返回第一个元素
l1.back()
反转和排序
l1.reverse(); //反转
l1.sort(); //排序,从小到大
bool myCompare(int a, int b)
{ return a > b; }
l1.sort(muCompare); //从大到小