List使用双向链表来管理元素
- 使用list,必须包含#include< list >
- list是定义与namespace std中的template
- list不支持随机存取,所以也不提供下标操作符和at()
- 任何位置上插入、删除元素都非常快
- 插入、删除元素不会造成reference、pointers、iterators失效
- list不提供容量,空间重新分配等操作函数,每个元素都有自己的内存,在被删除之前一直有效
- list提供一些特殊函数,例如:unique(),sort(),merge(),reverse();这些函数执行起来更快,因为它们无需拷贝或移动,只需调整若干指针即可
- list异常处理
//练习代码
#include<iostream>
using namespace std;
#include<list>
void Funtest()//list的构造函数和拷贝构造函数
{
list<int> L; //构造一个空的list
list<int> L1(12);//构造一个有12个元素的list,这些元素都用default构造函数初始化
list<int> L2(12,8);//构造一个有12个元素的list,每个元素初始值为8
list<int> L3(L2);//用L2拷贝构造一个L3
list<int>::iterator it = L3.begin();
list<int>::iterator it1 = L3.end();
list<int> L4(it,it1);//构造一个list,并以区间[it,it1]内的元素为初始值
}
void Funtest1()
{
list<int> L;
list<int> L1(10);
cout << "L.size = " << L.size() << endl;//返回list元素个数
cout << "L.size = " << L.max_size()<< endl;//返回list元素最大可能容量
cout << "L1.size = " << L1.size() << endl;
if (L.empty())//判断list是否为空
cout << "L is NULL" << endl;
else
cout << "L is not NULL" << endl;
if (L == L1)
cout << "L == L1" << endl;
else if (L < L1)
cout << "L < L1" << endl;
else
cout << "L > L1" << endl;
L.swap(L1);//交换两个list
swap(L,L1);
L = L1;//赋值
L.assign(4,8);//将4个8拷贝给L
L.assign(L1.begin(),L1.end());//将区间[L1.begin(),L1.end()]的元素拷贝给L
//front、back都不检查元素是否存在
cout << L1.front() << endl;//返回L1第一个元素
cout << L1.back() << endl;//返回L1最后一个元素
}
void Funtest2()//迭代器
{
list<int> L;
L.push_back(1);
L.push_back(2);
L.push_back(3);
list<int>::iterator it;
list<int>::iterator it1;
list<int>::iterator it2;
list<int>::iterator it3;
//it = L.begin();//指向第一个元素
//it1 = L.end();//指向最后一个元素的下一位置
//it = L.rbegin();//指向逆向的第一个元素
//it3 = L.rend();//指向逆向的最后一个元素的下一位置
}
void Funtest3()//插入、移除
{
list<int> L;
list<int> L1(5,1);
list<int>::iterator it = L.begin();
L.insert(it,1);//在pos位置插入1
L.insert(it,3,3);//在pos位置插入3个值为3的元素
L.insert(it,L1.begin(),L1.end());//在pos位置插入区间[L1.begin(),L1.end()]的元素
L.erase(L.begin());//移除迭代器所指元素,返回下一个元素位置
L1.erase(L1.begin(),L1.end());//移除区间[]上的元素,返回下一个元素位置
L.push_back(6);//尾插
L.pop_back();//尾删
L.push_front(12);//头插
L.pop_front();//头删
L.remove(1);//移除值为1的元素
L.resize(12);//将元素的数量改为12,如果size()变大,则多出的新元素都需要default构造函数构造完成
L.resize(2);
L.resize(12, 8);//将元素的数量改为12,如果size()变大,则多出的新元素都是8
L.resize(2, 8);
L.clear();//清空list
//L.remove_if(op)//???????
}
void Funtest4()
{
list<int> L;
list<int> L1;
list<int> L2(2);
L1.push_back(3);
L1.push_back(1);
L1.push_back(2);
L.push_back(4);
L.resize(4,1);
L.push_back(3);
L.resize(7, 2);
L.unique();//移除重复的元素
//L.splice(L.begin(),L1);
//L.splice(L.begin(),L1,L1.begin());
//L.splice(L.begin(),L1, L1.begin(),L1.end());
//L.splice(L.rbegin(), L1);
L.sort();//排序
L1.sort();
L.merge(L1);//将L1的元素转移到L中并且保证L1有序,L1中元素清空(必须L1,L已序)
L.reverse();//将元素反序
L1.reverse();
}
int main()
{
//Funtest();
//Funtest1();
//Funtest2();
//Funtest3();
Funtest4();
return 0;
}