stl list 硬粪脱水
来源:互联网 发布:使用Java无法输出数值 编辑:程序博客网 时间:2024/04/27 13:45
基本性质
1.缺点:
list是由双向链表实现的,因此内存空间是不连续的。
只能通过指针访问数据,所以list的随机存取非常没有效率,时间复杂度为o(n);
2.优点:
但由于链表的特点,能高效地进行插入和删除。
因此list::iterator则不支持“+”、“+=”、“<”等
3.使用地点:
如果需要大量的插入和删除,而不关心随机存取,则应使用list。
List 初始化,插入
list a1{1,2,3,4,5}
c.assign(n,num) 将n个num拷贝赋值给链表c。
c.assign(beg,end) 将[beg,end)区间的元素拷贝赋值给链表
c.front() 返回链表c的第一个元素。
c.back() 返回链表c的最后一个元素。
c.insert(pos,num) 在pos位置插入元素num。
c.insert(pos,n,num) 在pos位置插入n个元素num。
c.insert(pos,beg,end) 在pos位置插入区间为[beg,end)的元素。
c.push_back(num) 在末尾增加一个元素。
c.push_front(num) 在开始位置增加一个元素。
#include<iostream>#include<list>#include<algorithm>using namespace std;typedef list<int>::iterator ITER;typedef list<int> LIST;int main(){ LIST t;//将3个5拷贝赋值给链表t。 t.assign(3,5);//重新覆盖原值 将[beg,end)区间的元素拷贝赋值给链表t。 int k[5]= {0,3,5,7,8}; t.assign(k,k+5); for(ITER it=t.begin(); it!=t.end(); it++) cout<<*it; ITER it; for(it=t.begin(); *it<4; it++);//在it位置插入2个元素*it-1。 t.insert(it,2,*it-1);//在it位置插入区间为[beg,end)的元素。 int m[3]= {1,1,1}; t.insert(it,m,m+3); for(ITER it=t.begin(); it!=t.end(); it++) cout<<*it; return 0;}
删除
1类
c.pop_back() 删除末尾的元素。
c.pop_front() 删除第一个元素。
2类
Erase(iter) 删除地址的元素
3类
remove(num) 直接删除链表中num元素。
bool comp(int n){ return n>=3;}int main(){ int arr[8]= {1,2,3,4,5,6,7,8}; list<int>a(arr,arr+8); a.remove_if(comp); for(int i:a)cout<<i<<" "; return 0;}
输出 1 2 这鬼东西就是补集似乎 n>=3 《=》n<3
resize重定义长度
resize(n) 从新定义链表的长度,超出原始长度部分用0代替,小于原始部分删除。
resize(n,num) 从新定义链表的长度,超出原始长度部分用num代替。
#include<iostream>#include<list>#include<algorithm>using namespace std;typedef list<int>::iterator ITER;typedef list<int> LIST;int main(){ int arr[5]={1,2,3,4,5}; LIST t(arr,arr+5);// t.resize(10); for(ITER it=t.begin();it!=t.end();it++)cout<<*it; cout<<endl; t.resize(10,-1); for(ITER it=t.begin();it!=t.end();it++)cout<<*it; return 0;}
Swap 交换
c1.swap(c2); 将c1和c2交换。
swap(c1,c2); 同上。
#include<iostream>#include<list>#include<algorithm>using namespace std;typedef list<int>::iterator ITER;typedef list<int> LIST;int main(){ int arr[5]= {1,2,3,4,5}; LIST t(arr,arr+5); LIST k(5,0); for(ITER it=t.begin(); it!=t.end(); it++)cout<<*it; cout<<endl; for(ITER it=k.begin(); it!=k.end(); it++)cout<<*it; cout<<endl<<endl; swap(k,t); for(ITER it=t.begin(); it!=t.end(); it++)cout<<*it; cout<<endl; for(ITER it=k.begin(); it!=k.end(); it++)cout<<*it; cout<<endl; return 0;}
merge合并
专门针对链表的merge
c1.merge(c2) 合并2个有序的链表并使之自动排序(默认是从小到大)。从新放到c1里,释放c2。
c1.merge(c2,comp) 合并2个有序的链表并使之按照自定义规则排序之后从新放到c1中,释放c2。
#include<iostream>#include<vector>#include<array>#include<algorithm>#include<list>using namespace std;bool comp(const int &x,const int &y){ return x>y;}int main(){ list<int>t{1,3,5,7,9}; list<int>x{2,4,6,8,10}; t.merge(x); for(int i:t)cout<<i<<" "; return 0;}
sort排序
不要像其他容器写成sort(t,t+5,comp)这样
list的sort方法专门固定写成:t.sort(comp);
提供不专门写函数方法的快捷写法:
a1.sort([](int n1,int n2){return n1>n2;});
Splice 连接
将c2的[beg,end)位置的元素连接到c1的beg位置
并且释放c2的[beg,end)位置的元素
变式:
c1.splice(c1.beg,c2)
c1.splice(c1.beg,c2,c2.beg)
c1.splice(c1.beg,c2,c2.beg,c2.end)
int main(){ list<int>t{1,3,5,7,9}; list<int>x{2,4,6,8,10}; t.splice(t.begin(),x); for(int i:t)cout<<i<<" "; return 0;}
reverse反转
list<int> a1{1,2,3,4,5};a1.reverse();
Unique 删除相同元素
list<int> a1{1,1,3,3,5}; a1.unique();
输出1 3 5
- stl list 硬粪脱水
- stl map 硬粪脱水
- 脱水缩合
- STL--list
- STL--list
- STL list
- STL list
- STL----list
- STL list
- stl-list
- stl list
- STL--list
- STL list
- stl list
- STL---List
- STL list
- STL list
- STL list
- form表单标签
- 归心似箭,马不停蹄
- eclipse导入myeclipse web项目的方法
- 主要看气质 极致美颜手机让自拍党更大胆
- 每日产品辣评:160万元个人飞行背包深圳首秀,迪拜已预订20台
- stl list 硬粪脱水
- hive中时间日期函数的使用
- 漫步最优化三十四——高斯-牛顿法
- 腾讯手机管家跃居行业第一 创新方法论首次披露
- GCC编译时使用C++11standard
- 2017-10-28
- Servlet进阶2
- numpy中argsort
- Unity-Unity编辑器Part1