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