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++ STL之list的简单使用

C++ STL之list的简单使用

C++ STL之list的简单使用

C++ STL之list的简单使用

 

C++ vector的简单使用

http://blog.****.net/lady_killer9/article/details/79237116

 

 

C++ STL双端队列deque的简单使用

 

 

 

http://blog.****.net/lady_killer9/article/details/79263950

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。