List
特点:
1.它实质上是一个双向链表
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3hpYW9idXB0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">
2.使用时包括<list>头文件 #include<list>
3.不支持随机訪问迭代器,仅仅能使用双向迭代器 //因此不能使用一些算法和运算符操作
4.在不论什么位置的插入、删除操作都是常数时间
成员函数
初始化
list <int> intlist0; // 创建空的 intlist list <int> intlist1( 3 ); //包括3个元素 list <int> intlist2( 5, 2 ); //包括5个元素,每一个都为2
訪问操作
front() |
返回第一个元素 (不检查容器是否为空) |
back() |
返回最后一个元素(不检查容器是否为空) |
pop_back() |
添加一元素到链表尾 |
pop_front() |
添加一元素到链表头 |
push_back() |
删除链表尾的一个元素 |
push_front() |
删除链表头的一元素 |
assign() |
擦除链表中的元素并把新的元素拷贝到目标链表中 |
empty() |
推断链表是否为空。假设是空,返回true。 |
举例:
#include <iostream>
#include <list>
using namespace std; int main()
{
list<int> intlist;
list<int>::iterator intiter;
list<int>::reverse_iterator intriter;
if(intlist.empty())
cout<<"intlist为空"<<"\n"; //为空 intlist.assign(4,1);
cout<<"运行assign(4,1)后,intlist:";
for(intiter=intlist.begin();intiter!=intlist.end();++intiter)
cout<<*intiter;
cout<<"\n"; //输出1111 cout<<"intlist.front :";
cout<<intlist.front();
cout<<"\n"; //输出1 cout<<"intlist.back :";
cout<<intlist.back();
cout<<"\n"; //输出1 intlist.push_back(5);
intlist.push_front(9);
cout<<"运行push_back和push_front:";
for(intiter=intlist.begin();intiter!=intlist.end();++intiter)
cout<<*intiter;
cout<<"\n"; //输出911115 cout<<"反向输出 :";
for(intriter=intlist.rbegin();intriter!=intlist.rend();++intriter)
cout<<*intriter;
cout<<"\n";
// 输出511119
intlist.pop_back();
intlist.pop_back();
intlist.pop_front();
intlist.pop_front();
cout<<"运行2次pop_back和2次pop_front : ";
for(intiter=intlist.begin();intiter!=intlist.end();++intiter)
cout<<*intiter<<" ";
cout<<"\n";
//输出11
getchar();
return 0;
}
操作list里的元素
clear() |
从容器中删除全部元素 |
erase(position) |
删除由position指定的位置上的元素 |
erase(beg,end) |
删除从beg到end-1之间的全部元素 |
insert(position, elem) |
将elem的一个拷贝插入到由position指定的位置上,并返回新元素的位置 |
inser(position, n, elem) |
将elem的n个拷贝插入到由 position指定的位置上 |
insert(position, beg, end) |
将从beg到end-1之间的全部元素的拷贝插入到vecList中由position指定的位置上 |
resize(num) |
将元素个数改为num。 假设size()添加。默认的构造函数负责创建这些新元素 |
resize(num, elem) |
将元素个数改为num。 假设size()添加。默认的构造函数将这些新元素初始化为elem |
size() |
链表当前的元素个数 |
list的一些算法
merge() |
lst1.merge (lst2); //合并 lst2到lst1并清空lst2 |
sort() |
对链表排序,默认升序 |
reverse() |
反转链表 |
remove() |
删除链表中所有匹配值的元素 |
splice() |
对两个链表进行结合,结合后第二个链表清空 |
unique() |
删除相邻反复元素 |
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
int main()
{
list<int> L(5,2);
list<int> ::iterator pl; L.unique();
for(auto i=L.begin();i!=L.end();i++)
cout<<*i; //输出2
cout<<endl; list<int> L1{1,3,2,5,4};
for(auto i=L1.begin();i!=L1.end();i++)
cout<<*i; //输出13254
cout<<endl;
L1.sort();
for(auto i=L1.begin();i!=L1.end();i++)
cout<<*i; //输出12345
cout<<endl; L1.reverse();
for(auto i=L1.begin();i!=L1.end();i++)
cout<<*i; //输出54321
cout<<endl; L1.push_back(3);
for(auto i=L1.begin();i!=L1.end();i++)
cout<<*i; //输出543213
cout<<endl;
L1.remove(3);
for(auto i=L1.begin();i!=L1.end();i++)
cout<<*i; //输出5421
cout<<endl; list<int> L2(1);
L2.merge(L1);
for(pl=L2.begin();pl!=L2.end();pl++)
cout<<*pl; //输出05421
cout<<endl; list<int> L3{1,2,3,4,5,6,7,8}; //假设想把这里面的1234截到L2的05之间
auto p1 = find(L3.begin(),L3.end(),1); //截取的过程中包含左不包含右
auto p2 = find(L3.begin(),L3.end(),5);
auto p3 = find(L2.begin(),L2.end(),5); //将该位置极其以后的元素皆后移一位
L2.splice(p3,L3,p1,p2);
for(pl=L2.begin();pl!=L2.end();pl++)
cout<<*pl; //输出012345421
cout<<endl;
for(pl=L3.begin();pl!=L3.end();pl++)
cout<<*pl; //输出5678
cout<<endl; return 0;
}
版权声明:本文博主原创文章,博客,未经同意不得转载。