C++中STL学习笔记——容器之list

时间:2022-07-23
本文章向大家介绍C++中STL学习笔记——容器之list,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

容器——list

概述

C++中的容器大致分为两类:顺序容器和关联容器。以后会逐一讲解。本文主要讲解顺序容器中的list。

想要使用list,需要包含头文件list,即#include<list>。List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。

1.定义和初始化

list<int> lst1;//创建空list

定义一个空的链表lst1

list<int> lst2(3);//创建含有三个元素的list

定义一个长度为3的链表,默认初始化为0

list<int> lst3(3,2);//创建含有三个元素的list

定义一个长度为3,元素值为2的链表

list<int> lst4(lst2);//使用lst2初始化lst4,初始化后lst2=lst4
list<int> lst5(lst2.begin(),lst2.end());//同上

将某一个链表复制给另一个

2.常见操作

lst1.assign(lst2.begin(),lst2.end());//分配值

将lst2的值分配给lst1

lst1.push_back(10);//添加值

在lst1的末尾添加一个元素10

lst1.pop_back();//删除末尾值

删除lst1的末尾

lst1.begin();//返回首值的迭代器
lst1.end();//返回尾值的迭代器
lst1.front();//返回第一个元素的引用
lst1.back();//返回最后一个元素的引用

在vector中已经讲过begin和end了,这里就只讲front和back,他俩是引用,因此可以直接访问,即可以写作。

cout<<lst1.front()<<endl;//返回第一个元素的引用
cout<<lst1.back()<<endl;//返回最后一个元素的引用
bool isEmpty1 = lst1.empty();//判断为空

判断是否为空

lst1.erase(++lst1.begin(),--lst1.end());//删除元素,由于迭代器是地址指针,因此不能直接+1,需要写成++或者--

删除之间元素

lst1.insert(lst1.begin(),3,10);//从指定位置插入3个10

从指定位置插入指定数量的元素

cout<<*lst1.rbegin()<<endl;//返回第一个元素的前向指针
cout<<*lst1.rend()<<endl;//返回最后一个元素的前向指针

返回第一个元素的前向、后向指针, 返回一个逆序迭代器,它指向容器list的最后一个、第一个元素。

lst1.remove(10);//与remove形参相同的元素全部删除

删除与remove函数形参相同的结点

lst1.reverse();//反转

整个链表反转

lst1.unique();//删除相邻重复元素

删除整个链表中的重复结点,使得链表每个结点都不同

3.元素获取(遍历方法)

for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++){
       cout<<*iter<<endl;
 }

对于list而言,只能采用迭代器的方式访问(思考一下他的实现原理,很容易理解为何只能这样访问)。

4.以上代码的可执行代码

#include <iostream>
#include <list>
using namespace std;
//List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢。
int main(){
    //1.定义和初始化
    list<int> lst1;//创建空list
    list<int> lst2(3);//创建含有三个元素的list
    list<int>::iterator iter0=lst2.begin();
    for(int i=1;iter0!=lst2.end();iter0++){
        *iter0=i++;
    }
    list<int> lst3(3,2);//创建含有三个元素的list
    list<int> lst4(lst2);//使用lst2初始化lst4,初始化后lst2=lst4
    list<int> lst5(lst2.begin(),lst2.end());//同上

    //2.常见操作
    lst1.assign(lst2.begin(),lst2.end());//分配值
    list<int>::iterator iter=lst1.begin();
    for(;iter!=lst1.end();iter++){
        cout<<*iter<<endl;
    }
    cout<<"lst1.size="<<lst1.size()<<endl;
    lst1.push_back(10);//添加值
    cout<<"lst1.size="<<lst1.size()<<endl;
    lst1.pop_back();//删除末尾值
    cout<<"lst1.size="<<lst1.size()<<endl;
    lst1.begin();//返回首值的迭代器
    lst1.end();//返回尾值的迭代器
    bool isEmpty1 = lst1.empty();//判断为空
    cout<<"lst1是否为空:"<<isEmpty1<<endl;
    lst1.erase(++lst1.begin(),--lst1.end());//删除元素,由于迭代器是地址指针,因此不能直接+1,需要写成++或者--
    cout<<"lst1.size="<<lst1.size()<<endl;
    cout<<lst1.front()<<endl;//返回第一个元素的引用
    cout<<lst1.back()<<endl;//返回最后一个元素的引用
    lst1.insert(lst1.begin(),3,10);//从指定位置插入3个10
    cout<<"lst1.size="<<lst1.size()<<endl;
    cout<<*lst1.rbegin()<<endl;//返回第一个元素的前向指针, 返回一个逆序迭代器,它指向容器c的最后一个元素
    lst1.remove(10);//与remove形参相同的元素全部删除
    cout<<"lst1.size="<<lst1.size()<<endl;
    cout<<"反转前lst1[0]="<<*lst1.begin()<<endl;
    lst1.reverse();//反转
    cout<<"反转后lst1[0]="<<*lst1.begin()<<endl;
    lst1.sort();//排序
    cout<<"排序后lst1[0]="<<*lst1.begin()<<endl;
    lst1.insert(lst1.begin(),100,2);//从指定位置插入100个2
    cout<<"去重前lst1.size="<<lst1.size()<<endl;
    lst1.unique();//删除相邻重复元素
    cout<<"去重后lst1.size="<<lst1.size()<<endl;

    //遍历
    for(list<int>::const_iterator iter = lst1.begin();iter != lst1.end();iter++)
    {
       cout<<*iter<<endl;
    }
    //getchar();
    return 0;
}