C++ STL之list的简单使用_使用stl中的数据结构列表来创建一个列表,以保存输入的整数序列,并调用它的擦除函

目录

简介

代码

运行截图

常用函数

参考


简介

list是双向链表,有vector,deque的特征,而且效率高,缺点是,它不能像 array 和 vector 那样,通过位置直接访问元素。

如何需要对序列进行大量添加或删除元素的操作,而直接访问元素的需求却很少,这种情况建议使用 list 容器存储序列。

它有插入(前插,后插,中间插),删除(前删,后删,清空等),排序等功能。

而且,可以剔除连续相同元素,保留一个。

接下来,用一个程序将它的功能串起来。

代码

/*

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;
}

运行截图

------------------------------------------------2020-08-29更新-------------------------------------------------

常用函数

常用成员函数功能
begin()返回指向容器中第一个元素的双向迭代器。
end()返回指向容器中最后一个元素的双向迭代器。
rbegin()返回指向最后一个元素的反向双向迭代器。
rend()返回指向第一个元素所在位置前一个位置的反向双向迭代器。
empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
size()返回当前容器实际包含的元素个数。
front()返回第一个元素的引用。
back()返回最后一个元素的引用。
assign()用新元素替换容器中原有内容。
emplace_front()在容器头部生成一个元素。该函数和 push_front() 的功能相同,但效率更高。
push_front()在容器头部插入一个元素。
pop_front()删除容器头部的一个元素。
emplace_back()在容器尾部直接生成一个元素。该函数和 push_back() 的功能相同,但效率更高。
push_back()在容器尾部插入一个元素。
pop_back()删除容器尾部的一个元素。
emplace()在容器中的指定位置插入元素。该函数和 insert() 功能相同,但效率更高。
insert()在容器中的指定位置插入元素。
erase()删除容器中一个或某区域内的元素。
swap()交换两个容器中的元素,必须保证这两个容器中存储的元素类型是相同的。
clear()删除容器存储的所有元素。
void splice (iterator position, list& x);position 为迭代器,用于指明插入位置;x 为另一个 list 容器。 此格式的 splice() 方法的功能是,将 x 容器中存储的所有元素全部移动当前 list 容器中 position 指明的位置处。
void splice (iterator position, list& x, iterator i);position 为迭代器,用于指明插入位置;x 为另一个 list 容器;i 也是一个迭代器,用于指向 x 容器中某个元素。 此格式的 splice() 方法的功能是将 x 容器中 i 指向的元素移动到当前容器中 position 指明的位置处。
void splice (iterator position, list& x, iterator first, iterator last);position 为迭代器,用于指明插入位置;x 为另一个 list 容器;first 和 last 都是迭代器,[fist,last) 用于指定 x 容器中的某个区域。 此格式的 splice() 方法的功能是将 x 容器 [first, last) 范围内所有的元素移动到当前容器 position 指明的位置处。
remove(val)删除容器中所有等于 val 的元素。
remove_if()删除容器中满足条件的元素。
unique()删除容器中相邻的重复元素,只保留一个。
merge()合并两个事先已排好序的 list 容器,并且合并之后的 list 容器依然是有序的。
sort()通过更改容器中元素的位置,将它们进行排序。
reverse()反转容器中元素的顺序。

list迭代器p1、p2,整数i

  • p1[i]:不能通过下标访问 list 容器中指定位置处的元素。
  • p1-=i、 p1+=i、 p1+i 、p1-i:双向迭代器 p1 不支持使用 -=、+=、+、- 运算符。
  • p1<p2、 p1>p2、 p1<=p2、 p1>=p2:双向迭代器 p1、p2 不支持使用 <、 >、 <=、 >= 比较运算符。

注意:list 容器在进行插入insert())、接合(splice())等操作时,都不会造成原有的 list 迭代器失效,甚至进行删除操作时只有指向被删除元素的迭代器失效,其他迭代器不受任何影响。对于非 const 类型的 list 容器,迭代器不仅可以访问容器中的元素,也可以对指定元素的值进行修改。

参考

cplusplus-list

-----------------------------------------------2020-08-29更新---------------------------------------------------

更多STL例子:C++ STL的使用

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

(1)Python所有方向的学习路线(新版)

这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

最近我才对这些路线做了一下新的更新,知识体系更全面了。

在这里插入图片描述

(2)Python学习视频

包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。

在这里插入图片描述

(3)100多个练手项目

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。

在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值