C++list学习

C++ list学习

概念

list 容器模板定义在 list 头文件中,是 T 类型对象的双向循环链表。

list 容器具有一些 vector 和 deque 容器所不具备的优势,它可以在常规时间内,在序列已知的任何位置插入或删除元素。这是我们使用 list,而不使用 vector 或 deque 容器的主要原因。

list 的缺点是无法通过位置来直接访问序列中的元素,也就是说,不能索引元素。为了访问 list 内部的一个元素,必须一个一个地遍历元素,通常从第一个元素或最后一个元素开始遍历。

在这里插入图片描述

操作

1.list所在头文件

​ 使用list需要导入list头文件并且需要在std下使用:

#include<list>
using namespace std;

2.创建及初始化

2.1创建空的list
list<int> numList;
2.2创建带有给定数量的默认元素的list
list<string> strList(20);//这是创建了一个拥有20个空字符串的list
list<int> intList(20);//创建拥有20个0的list
2.3创建带有指定元素的list
//当<>内的数据类型与{}内的数据类型相同时,就是用{}中的元素初始化list
list<int> intList {2};//创建一个int类型的list,list中有一个元素2
list<int> intList {2,3,4};//创建一个int类型的list,list中有三个元素2,3,4
list<string> strList {"abc","def","ghi"};//创建一个string类型的list,list中有三个字符串
2.4创建带有指定数量相同元素的list
list<double> doubleList(50,3.1415926);//创建一个含有50个3.1415926的list

3.遍历

​ list使用迭代器进行遍历,并且由于list是双向循环链表,所以当迭代器超过end()时,会回到list的第一个元素。

注意:迭代器指向end()时,不是指向最后一个结点,而是最后一个结点的后一个位置,表示list的末尾,并且这个位置存储一个与最后一个结点值相同的元素,例如:list为{1,2,3,4},则list.end()位置也存了一个4

list<int> intList {1,2,3};
list<int>::iterator iter = intList.begin();//迭代器指向intList的第一个元素
iter--;//执行此操作后,iter指向intList.end(),因为list是循环链表
list<int>::iterator iter = intList.end();//迭代器指向intList的最后一个元素的后一位置
iter++;//执行此操作后,iter指向intList.begin(),因为list是循环链表
iter++;//iter指向后继结点
iter--;//iter指向前驱结点
//由于迭代器一次只能移动一个位置,所以当要移动多个位置时需要使用advance函数来实现
advance(iter,5);//iter向后移动5个位置
//遍历操作
for (list<int>::iterator i = intList.begin(); i != intList.end(); i++) {
  cout << *i << endl;//有此可见迭代器和指针很类似
}

4.插入

4.1从头尾插入
list<int> intList;
intList.push_front(1);//在list表头插入一个1
intList.push_back(2);//在list表尾插入一个2
4.2从中间插入
list<int> intList {1,2,3,4,5};
list<int>::iterator it = intList.begin();
it++;
it++;
intList.insert(it,9);
//以上操作之后intList变为{1,2,9,3,4,5},有此可见,insert函数是将元素插到指定的位置,该位置原来的元素位于新元素的后面,但这并不意味着发生了元素移动,因为list是用链表实现的。

5.删除

list<int> intList <1,2,3,4,5,6>
list<int>::iterator it = intList.begin();
advance(it,3);//it指向4这个元素
intList.erase(it);//将4删除
//注意:将4删除之后,it还是指向4的,所以如果要让it指向后面的元素,需要it++
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值