C++ STL之list的简单使用
list是双向链表,有vector,deque的特征,而且效率高。
它有插入(前插,后插,中间插),删除(前删,后删,清空等),排序等功能。
而且,可以剔除连续相同元素,保留一个。
接下来,用一个程序将它的功能串起来,文章末尾有vector等的链接。
代码:
/*
list
Author:YuBo
Date:2018/2/5
*/
//注意与vector deque的相同点与不同点
#include<iostream>
#include<list>
#include<algorithm>
using namespace std;
list<int> l;
list<int>::iterator it;
list<int>::reverse_iterator rit;
void menu()
{
cout<<"******1.插入 2.删除************"<<endl;
cout<<"******3.读取首元素 4.读取末元素******"<<endl;
cout<<"******5.排序 6.查找************"<<endl;
cout<<"******7.剔除连续重复元素 8.显示所有元素****"<<endl;
cout<<"******9.退出*****************************"<<endl;
}
void PUSH()/*注意与deque的不同,双向链表list的插入全部扩张*/
{
int i,j,place,n,N;
cout<<"******1.前插 2.后插 3.中间插入*****"<<endl;
cin>>j;
switch(j)
{
case 1:{//前面插入,扩张
cout<<"请输入你要输入的整数个数:"<<endl;
cin>>N;
cout<<"请输入"<<N<<"个整数:"<<endl;
for(i=0;i<N;i++)
{
cin>>n;
l.push_front(n);
}
}break;
case 2:{ //从后面插入,扩张
cout<<"请输入你要输入的整数个数:"<<endl;
cin>>N;
cout<<"请输入"<<N<<"个整数:"<<endl;
for(i=0;i<N;i++)
{
cin>>n;
l.push_back(n);
}
}break;
case 3:{//中间插,扩张,后移
cout<<"请输入你要插入的位置(首位置为0):"<<endl;
cin>>place;
cout<<"请输入你要插入的数值:"<<endl;
cin>>n;
it=l.begin();
while(place){it++;place--;} //注意只能++或--不能+n或-n
l.insert(it,n);
}break;
default:cout<<"输入错误!"<<endl;
}
}
void POP()
{
int i,j,place,N;
cout<<"******1.前删 2.后删 3.中间删 4.清空*****"<<endl;
cin>>j;
switch(j)
{
case 1:{
cout<<"请输入你要删除的整数个数:"<<endl;
cin>>N;
if(N>l.size())cout<<"里面没有这么多元素。。。"<<endl;
else{
for(i=0;i<N;i++)
{
l.pop_front();
}
}
}break;
case 2:{
cout<<"请输入你要删除的整数个数:"<<endl;
cin>>N;
if(N>l.size())cout<<"里面没有这么多元素。。。"<<endl;
else{
for(i=0;i<N;i++)
{
l.pop_back();
}
}
}break;
case 3:{
cout<<"请输入你要删除的位置(首位置为0):"<<endl;
cin>>place;
if(place<0||place>l.size())cout<<"位置超界。"<<endl;
else{
it=l.begin();
while(place)it++;
l.erase(it);
}
}break;
case 4:{
l.clear();
}break;
default:cout<<"输入错误!"<<endl;
}
}
void Getfront()
{
if(l.empty())cout<<"队已经空了!"<<endl;
else cout<<"队顶元素为:"<<l.front()<<endl;
}
void Getback()
{
if(l.empty())cout<<"队已经空了!"<<endl;
else cout<<"队尾元素为:"<<l.back()<<endl;
}
void Getsize()
{
cout<<"双端队列的大小为:"<<l.size()<<endl;
}
void Sort()
{
l.sort();//排序后前序遍历是升序,反向遍历是降序
}
void Find()
{
int n;
cout<<"请输入你要查找的数:"<<endl;
cin>>n;
it=find(l.begin(),l.end(),n);
if(it!=l.end())
{
int sum=0;
list<int>::iterator temp;
temp=l.begin();
while((*temp)!=(*it)){sum++;temp++;}
cout<<n<<"是第"<<sum<<"个数。"<<endl;
}
else
cout<<"没找到"<<endl;
}
void Unique()
{
l.unique();//重复元素保留一个
}
void Display()
{
int i;
cout<<"*******1.前向遍历 2.反向遍历******"<<endl;
cin>>i;
switch(i)
{
case 1:{
for(it=l.begin();it!=l.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}break;
case 2:{
for(rit=l.rbegin();rit!=l.rend();rit++)
{
cout<<*rit<<" ";
}
cout<<endl;
}break;
default:cout<<"输入错误!"<<endl;
}
}
int main()
{
int i;
while(1)
{
menu();
cout<<"请输入菜单号:"<<endl;
cin>>i;
if(i==9)break;
switch(i)
{
case 1:PUSH();break;
case 2:POP();break;
case 3:Getfront();break;
case 4:Getback();break;
case 5:Sort();break;
case 6:Find();break;
case 7:Unique();break;
case 8:Display();break;
default:cout<<"输入错误!";break;
}
}
return 0;
}
运行截图:
C++ vector的简单使用
http://blog.****.net/lady_killer9/article/details/79237116
C++ STL双端队列deque的简单使用
http://blog.****.net/lady_killer9/article/details/79263950
有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。