#include<iostream>
#include<list>//类似于双向循环链表
using namespace std;
void show(list<int>l){//输出容器list中的内容
for(list<int>::iterator it=l.begin();it!=l.end();it++){
cout<<*it<<" ";
}
cout<<endl;
}
//正因为list容器是序列式容器,所以list的迭代器只能前移或后移,不能一次移动多个位置
//在网上没有找到明确说明两者是因果关系. 这句话是我的猜想
//list构造函数
void test1(){
list<int>l1;//默认构造形式
//show(l1);//空容器
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
//show(l1);//10 20 30 40
//构造函数将区间中的元素拷贝给本身
list<int>l2(l1.begin(),l1.end());
//show(l2);//10 20 30 40
//拷贝构造函数
list<int>l3(l2);
//show(l3);//10 20 30 40
//将n个elem拷贝给本身
list<int>l4(5,100);
//show(l4);//100 100 100 100 100
}
//list赋值
void test2(){
list<int>l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
list<int>l2;
l2=l1;//重载了等号 可以直接容器直接赋值
cout<<"l1容器里的数据为:";//10 20 30 40
show(l1);
cout<<"l2容器里的数据为:";//10 20 30 40
show(l2);
list<int>l3;
l3.assign(l2.begin(),l2.end());//内置函数 可以以区间形式赋值
show(l3);//10 20 30 40
list<int>l4;
l4.assign(5,10);//assign函数也支持n个elem值拷贝赋值
show(l4);//10 10 10 10 10
}
//list交换
void test3(){
list<int>l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
list<int>l2;
l2.push_back(100);
l2.push_back(200);
cout<<"交换前"<<" ";
cout<<"l1=";
show(l1);//10 20 30 40
cout<<"l2=";
show(l2);//100 200
cout<<"交换后"<<" ";
l1.swap(l2);
cout<<"l1";
show(l1);//100 200
cout<<"l2=";
show(l2);//10 20 30 40
}
//list大小操作
void test4(){
list<int>l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
l1.push_back(40);
//empty()和size()可以作为表达式的一部分处理
//但是如果拿变量来接受值 再输出变量则不能实现
cout<<"l1容器是否为空"<<l1.empty()<<endl;//0
cout<<"l1的大小为"<<l1.size()<<endl;//4
l1.resize(6);//重新定义容器大小,如果变大则以默认值来填充
show(l1);//10 20 30 40 0 0
l1.resize(6,100);//重新定义容器大小,如果变大则以给定的elem来填充
show(l1);//10 20 30 40 100 100
l1.resize(2);//重新定义容器大小,如果变小则删除超出范围的数据
show(l1);//10 20
}
//list 插入和删除
void test5(){
//list<int>l1;
//l1.push_back(10);//list容器尾部加入一个元素
//l1.push_front(20);//list容器开头加入一个元素
//l1.pop_back();//删除容器最后一个元素
//l1.pop_front();//删除容器开头一个元素
list<int>l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
list<int>::iterator it=l1.begin();//通过迭代器的移动来访问位置
l1.insert(++it,100);//在第二个位置插入100
show(l1);//10 100 20 30
l1.insert(it,2,99);//迭代器的位置不变,插入2个99
show(l1);//10 100 99 99 20 30
list<int>l2;
l2.push_back(1);
l2.push_back(2);
l1.insert(it,l2.begin(),l2.end());//插入区间的元素
show(l1);//10 100 99 99 1 2 20 30
l2.clear();//清空容器
show(l2);
l1.erase(l1.begin());//删除指定位置元素
show(l1);//100 99 99 1 2 20 30
list<int>::iterator itt=l1.begin();
l1.erase(++itt,l1.end());//删除区间元素
show(l1);//100
l1.push_back(66);//移除所有与66想匹配的元素
show(l1);//100 66
l1.remove(66);
show(l1);//100
}
//list开头和结尾数据读取
void test6(){
list<int>l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
//迭代器不支持随机访问
cout<<"l1的第一个元素为"<<l1.front()<<endl;//10
cout<<"l1的最后一个元素为"<<l1.back()<<endl;//30
}
bool compare(int v1,int v2){
return v1>v2;//降序
}
void test7(){
list<int>l1;
l1.push_back(10);
l1.push_back(20);
l1.push_back(30);
show(l1);//10 20 30
l1.reverse();//将容器中的元素反转
show(l1);//30 20 10
l1.push_back(15);
show(l1);//10 20 30 15
l1.sort();//从小到大排序{默认} sort函数是内部提供的方法
show(l1);//10 15 20 30
l1.sort(compare);//逆序
show(l1);//30 20 15 10
/*
sort的逆序我vc6.0一直在报错
不知道为什么,代码应该没问题
还有一种逆序的思路是 可以将容器先升序然后reverse反转一下
*/
}
int main(){
/*
test1(); 构造
test2(); 赋值
test3(); 交换
test4(); 大小操作
test5(); 插入和删除
test6(); 数据存取
test7(); 反转和排序
*/
return 0;
}