list作为STL重要的容器之一,保存在其中的每个元素之间使用链表相连,故而访问元素没有像数组访问模式一样的vector快,但是随机插入元素却比vector快,原理和数组与链表的操作有异曲同工之妙。对每个元素分配空间,不存在空间不够而重新分配的情况。
下面就以程序的方式展示list的基本操作,包括容器构造,插入元素(包括指定位置插入多个元素),排序,首尾元素输出与输入,逆序,删除重复元素,擦除指定位置元素,逆向输出等基本操作。
建议程序运行结果和程序语言比对查看,这样对基本操作符号命令的印象更加深刻。
#include<iostream>//list用法
#include<list>
#include<string>
#include<vector>
using namespace std;
int main()
{
//构造函数
string temp="I love you";
vector<int>temp1(10,20);
list<int>test1;//构造函数 1
list<float>test2(10); //构造函数2
list<string>test3(10,"I love you");//构造函数3
list<char>test4(temp.begin(),temp.end());//构造函数4
list<char>test5(test4);//复制构造函数(构造函数5)
//判断是否为空操作
if(test1.size()==0)cout<<"list1的size()为空"<<endl;
if(test2.empty())cout<<"list2为空"<<endl;
//增加元素
test1.push_back(1);//向尾部追加
test1.push_front(10);//向头部添加
cout<<"after push_back(1) and push_front(10):"<<endl;
list<int>::iterator it=test1.begin();
for(;it!=test1.end();it++)//不能用it=it+1和it+=1
cout<<*it<<"\t";
cout<<endl;
cout<<"after insert(++test1.begin(),100)"<<endl;
test1.insert(++test1.begin(),100);//向test1中某位置添加元素
it=test1.begin();
for(;it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
cout<<"after insert(++test1.begin(),5,30)"<<endl;
test1.insert(++test1.begin(),5,30);//向test1中某位置添加n个相同元素
it=test1.begin();
for(;it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
cout<<"after insert(++++test1.begin(),temp1.begin(),temp.end())"<<endl;
test1.insert(++++test1.begin(),temp1.begin(),temp1.end());//想test1中添加其他容器区间内的元素
it=test1.begin();
for(;it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
//排序
cout<<"after sort:"<<endl;
test1.sort();
for(it=test1.begin();it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
//删除元素
test1.pop_back();
test1.pop_front();
cout<<"pop_back()和pop_front之后"<<endl;
for(it=test1.begin();it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
test1.remove(20);
test1.erase(++test1.begin());
test1.erase(++test1.begin(),------test1.end());//-------之后的语言没用
cout<<"test1.remove(20)和两次test1.erase(++begin())之后"<<endl;
for(it=test1.begin();it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
//逆向输出
cout<<"逆向输出 "<<endl;
list<int>::reverse_iterator it1=test1.rbegin();
for(;it1!=test1.rend();it1++)
cout<<*it1<<"\t";
cout<<endl;
//获取头元素和尾元素的引用
cout<<"front and back"<<endl;
cout<<test1.front()<<endl;
cout<<test1.back()<<endl;
//排序
cout<<"sort again:";
test1.sort();
for(it=test1.begin();it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
//删除重复
cout<<"unique:"<<endl;
test1.unique();
for(it=test1.begin();it!=test1.end();it++)
cout<<*it<<"\t";
cout<<endl;
//反转
cout<<"反转后"<<endl;
test1.reverse();
for(it=test1.begin();it!=test1.end();it++)//不能用it=it+1和it+=1
cout<<*it<<"\t";
cout<<endl;
}
运行结果如下:
后续再整理其他容器的基本操作。