list是链表的容器操作,能更快的插入删除
#include<list>
list<int> v;
一、添加数据操作
1.v.assign(4, 1);//将v的数据替换为4个1;
2.v.push_back(2);//在尾巴插一个2
3.v.push_front(3);//在头插一个3
4.v.emplace_back(4);//在尾巴插4
5.v.emplace_front(5);//在头插5
push与emplace有什么区别呢,我们更常用push,但是emplace其实效率更高,它省略了移动元素操作
6.v.emplace(v.begin(),int value);//it是迭代器,会删除当前迭代器的元素
7.v.insert(v.begin()+1,100)在第二个位置插一个100
8.v.insert(v.begin()+1,3,100);//这个意思是在第2的位置开始插入3个100
9.v.insert(v.begin() + 1, b , b + 2);//注意b为数组,将b从0~1(2不包含)的元素插到1的
二、查看数据
(1)不能v[n]注意;
(2)不能at
(3)一些其他函数查看值
v.back(); //返回v的最后一个元素
v.front(); //返回v的第一个元素
(4)好像没什么能按照位置找数据的,不过可以直接用遍历找
三、空间分配
这个没什么好分配的,因为链表不需要提前分配嘛
四、其他操作
1.v.size(); //返回v中元素的个数;
2.//没有v.capacity()的哦;
3.v.clear(); //清空v中的元素
4.v.empty(); //判断v是否为空,空则返回ture,不空则返回false
5.v.pop_back(); //删除v向量的最后一个元素
6.v.pop_froat();//删除头部元素
7.v.swap(b); //b为向量(就是list开辟的),将v中的元素和b中的元素进行整体性交换
8.v.begin();//返回起始迭代器位置
8.v.end();//返回最后迭代器(没有数据!!!)
9.使用reverse_iterator反向迭代器
(1)v.rend();//返回起始迭代器位置
(2)v.regain();/返回最后迭代器(没有数据!!!)
10.v.erase(v.begin()+1,v.begin()+3); //删除a中第1个(从第0个算起)到第2个元素,删除数据
11.v.remove(4);//删除全部4的节点
五、list才有的内函数成员
1.v.reverse();//方向反掉
2.v.sort();//排好序(默认从小到大)
3.v.merge(m);//m为另一个list容器,但是v,m都要从小到大顺序,否则报错
4.v.merge(m,greater<int>());//greater是库里面提供的,当然还要less(所以默认从小到大)
5.v.splice(v.begin(),m, m.begin(), m.end());//要插的起始位置,被插迭代器,起始位置+截至位置。(注意:这里发现list的+号没有重载,不能写v.begin()+1)但是++好像重载了
6. v.unique();//删除相同的元素(保留一个)
遍历容器
for (list<int>::iterator it = v.begin(); it != v.end(); ++it)
{
cout << *it << " ";
}如果非要一个位置的数据,我建议可以用循环,设置int n,然后--n到0;
2.v.sort();//排好序(默认从小到大)
怎么写函数让其从大到小呢?
bool greater(int x,int y) { return x>y; }
再调用v.sort(greater);即可
当然可以调用库函数嘛
库函数用了模板
所以调用时这样写v.sort(greater<int>());
为什么要加()呢,其实人家是结构体成员嘛。(附加库中排序函数)