C++入门之list的使用详解

目录
  • 前言
  • 构造的使用
    • 1 构造空list
    • 2 构造含n个值为val的元素
    • 3 拷贝构造
    • 4 用迭代区间
  • 迭代器接口
    • 1 正常迭代接口
    • 2 逆向迭代接口
  • 容量接口
  • 元素访问
  • 数据修改
    • 头插
    • 头删
    • 尾插
    • 尾删
    • pos位置插入
    • erase擦除pos位置
    • 交换两个链表元素
  • 总结

前言

今天我们终于来到了C++的list章节,在讲解之前,先回顾一下前面的vector和string吧.

vector和string的底层都是用的顺序表,因此其空间在物理结构上连续的.而今天的list却不一样,它在物理上是散乱的.因为list本质上是一个链表!,并且是一个带头双向循环链表,在前面的数据结构章节,还记得博主的链表实现吗?还疑惑博主为什么对于链表的起名很怪吗?因为就是为了今天的list讲解呀~

今天博主也主要将从list的构造使用,迭代器使用,相关容量操作,以及元素访问和数据修改等方面进行阐述

构造的使用

构造函数的使用主要有4个,分别如下

list() 构造空的list
list (size_type n, const value_type& val = value_type()) 构造的list中包含n个值为val的元素
list (const list& x) 拷贝构造函数
list (InputIterator first, InputIterator last) 用[first, last)区间中的元素构造list

1 构造空list

不需要传入任何参数,直接利用list类模板定义对象

list<int> l1;        //定义int型链表
list<char> l2;       //定义char型链表
list<double> l3;     //定义double型链表
//上面的三个对象,内容都空

2 构造含n个值为val的元素

按照上面的定义直接传参即可

list<int> l1(4,5);           //定义int型链表,含有4个5
list<char> l2(3,'s');        //定义char型链表,含有3个's'
list<double> l3(4,2.3);     //定义double型链表,含有4个2.3

3 拷贝构造

即传入一个同类型的list

list<int> l1(4,5);           //定义int型链表,含有4个5
list<int> l2(l1);            //把l1的内容复制一份给了l2

4 用迭代区间

**这里有个注意点,迭代区间是左闭右开的!**即不包含右边界.

int num[4] = {1,2,3,4};
list<char> l1(3,'w');
list<char> l2(l1.begin(),l1.end());  //end()是最后一个元素位置的下一个元素位置,所以不包括,因此l2的内容是 'w' 'w' 'w'
list<int> l3(num,num + 3);       //因为num+3的位置,索引为3,但是迭代区间左闭右开,所以不包括索引3位置,内容为1 2 3

迭代器接口

C++提供了如下:

函数声明 接口说明
begin() + end() 返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin() + rend() 返回第一个元素的reverse_iterator,即end位置 + 返回最后一个元素下一个位置的reverse_iterator,即begin位置

1 正常迭代接口

int num[5] = {1,2,3,4,5};
list<int> li(num,num+5);    //创建内容为1 2 3 4 5的链表
list<int>::iterator it = li.begin();
while(it = li.end())
{
    cout<<*it<<" ";
    it++;
}
//输出结果为: 1 2 3 4 5

2 逆向迭代接口

int num[5] = {1,2,3,4,5};
list<int> li(num,num+5);    //创建内容为1 2 3 4 5的链表
list<int>::iterator it = li.rbegin();
while(it = li.rend())
{
    cout<<*it<<" ";
    it++;
}
//输出结果为: 5 4 3 2 1

容量接口

主要有两个,如下:

函数声明 接口说明
empty() 检测list是否为空,是返回true,否则返回false
size() 返回list中有效节点的个数
int num[5] = {1,2,3,4,5};
list<int> li(num,num+5);    //创建内容为1 2 3 4 5的链表
list<int> li1;
if(li.empty())
{
    cout<<"list没有数据"<<endl;
}
else
{
    cout<<"list有"<<li.size()<<"个元素"<<endl;
}
if(li1.empty())
{
    cout<<"list1没有数据"<<endl;
}
else
{
    cout<<"list1有"<<li1.size()<<"个元素"<<endl;
}
/* 输出结果为:
list有5个元素
list1没有数据
*/

元素访问

这里c++提供了两个接口,分别用于首尾访问front() 和 back();

int num[5] = {1,2,3,4,5};
list<int> li(num,num+5);    //创建内容为1 2 3 4 5的链表
cout << "front获取的元素为:"<<li.front()<<endl;
cout << "back获取的元素为:"<<li.back()<<endl;
/* 结果为:
front获取的元素为: 1
back获取的元素为:  5
*/

数据修改

这里主要提供了如下接口:

函数声明 接口说明
push_front() 在list首元素前插入值为val的元素
pop_front() 删除list中第一个元素
push_back() 在list尾部插入值为val的元素
pop_back() 删除list中最后一个元素
insert(iterator pos,const value_type& val) 在list position 位置中插入值为val的元素
erase(iterator pos) 删除list position位置的元素
swap() 交换两个list中的元素

头插

list<int> li(2,3);
li.push_front(9);
//现在list的内容为:9 2 3

头删

list<char> li(3,'s');
li.pop_front();
//现在list的内容为:s s

尾插

list<char> li(3,'s');
li.push_back('a');
//现在list的内容为:s s s a

尾删

list<int> li(4,2);
li.pop_back();
//现在的list内容为: 2 2 2

pos位置插入

这里博主先介绍一个全局函数find(),它是一个函数模板

template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);

即我们需要传三个参数,前两个是迭代器区间,后是待查找值,其中迭代器区间是左闭右开.

list<int> li;
li.push_bakc(1);
li.push_bakc(2);
li.push_bakc(3);
list<int>::iterator it = li.begin();
it = find(it,it+3,2)       //找到元素2的位置
li.insert(it,66);
//现在的list内容为: 1 66 2 3

erase擦除pos位置

list<int> li;
li.push_bakc(1);
li.push_bakc(2);
li.push_bakc(3);
list<int>::iterator it = li.begin();
it = find(it,it+3,2)           //找到元素2的位置
li.erase(it);
//现在的list内容为: 1 3

交换两个链表元素

int num1[4] = {1,2,3,4};
int num2[5] = {5,4,3,2,1};
list<int> li1(num1,num1 + 4);
list<int> li2(num2,num2 + 5);
li1.swap(li2); //交换链表
//现在li1为: 5 4 3 2 1
//现在li2为: 1 2 3 4

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 基于C++ list中erase与remove函数的使用详解

    erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器.如下: 复制代码 代码如下: list ParticleSystem;list::iterator pointer;if(pointer->dead == true){   pointer = ParticleSystem.erase(pointer);} 有一段关于错误使用erase的程序 复制代码 代码如下: using namespace std;int main(){  std::listtest_list;

  • C++中list的使用方法及常用list操作总结

    C++中list的使用方法及常用list操作总结 一.List定义: List是stl实现的双向链表,与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.使用时需要添加头文件 #include <list> 二.List定义和初始化: list<int>lst1;          //创建空list     list<int> lst2(5);       //创建含有5个元素的list     list<int>lst3(3,2

  • C++ STL入门教程(2) list双向链表使用方法(附程序代码)

    一.简介 "Unlike other standard sequence containers, list and forward_list objects are specifically designed to be efficient inserting and removing elements in any position, even in the middle of the sequence." Lists将元素按顺序储存在链表中.与向量(vector)相比, 它允许快速

  • C++11中初始化列表initializer lists的使用方法

    C++11引入了初始化列表来初始化变量和对象.自定义类型,如果想用初始化列表就要包含initializer_list头文件. C++11将使用大括号的初始化(列表初始化)作为一种通用初始化方式,可用于所有类型.初始化列表不会进行隐式转换. C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用处吧,然后再详细介绍一下. 首先有了initializer_list之

  • C++ 使用模板实现一个List的实例

    C ++使用模板写的一个List template<class T> class List { private: struct Node { T data; Node *next; }; //head Node *head; //size int length; //process Node *p; //temp Node *q; public: List() { head = NULL; length = 0; p = NULL; } void add(T t) { if(head == N

  • Python入门之三角函数atan2()函数详解

    描述 atan2() 返回给定的 X 及 Y 坐标值的反正切值. 语法 以下是 atan2() 方法的语法: import math math.atan2(y, x) 注意:atan2()是不能直接访问的,需要导入 math 模块,然后通过 math 静态对象调用该方法. 参数 x -- 一个数值. y -- 一个数值. 返回值 返回给定的 X 及 Y 坐标值的反正切值. 实例 以下展示了使用 atan2() 方法的实例: #!/usr/bin/python import math print

  • Pythony运维入门之Socket网络编程详解

    Socket是什么? Socket 是电脑网络中进程间数据流的端点Socket 是操作系统的通信机制应用程序通过Socket进行网络数据的传输 首先,简单了解一下TCP通信过程: TCP三次握手(面试常考): 第一次握手:客户端 发送SYN报文,设置随机数序号X,服务器由SYN=1知道,客户端要求建立联机 第二次握手:服务器端接收到客户端的报文之后,经过处理,返回给客户端SYN+ACK报文,同时设置随机序号Y,此时返回的报文确认ACK=X+1 第三次握手:接收到报文的客户端,会在处理确认之后,再

  • 汇编语言入门汇编指令及寄存器详解教程

    目录 前言 什么是汇编语言 汇编语言产生的原因 汇编与二进制的关系 寄存器 寄存器作用 存取速度比较 寄存器分类 常用寄存器用途 寄存器EAX.AX.AH.AL的关系 汇编语言指令 数据传送指令 算术运算指令 逻辑运算指令 循环控制指令 转移指令 linux 和 windows 下汇编的区别 总结 前言 我们大都是被高级语言惯坏了的一代,源源不断的新特性正在逐步添加到各类高级语言之中,汇编作为最接近机器指令的低级语言,已经很少被直接拿来写程序了,不过我还真的遇到了一个,那是之前的一个同事,因为在

  • Spring入门到精通之注解开发详解

    目录 Spring原始注解 DI 依赖注入的注解实现方式 Spring新注解 @Configuration @ComponentScan @Import @PropertySource @value @Bean Spring整合Junit 原始Junit测试Spring的问题 上述问题解决思路 Spring集成Junit步骤 Spring集成Junit代码实现 Spring原始注解 Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以

  • Spring入门到精通之Bean标签详解

    目录 Bean标签基本配置 Bean标签范围配置 Bean生命周期配置 Bean的依赖注入入门 Bean的依赖注入概念 Bean的依赖注入方式 Bean的依赖注入的数据类型 引入其他配置文件(分模块开发) Bean标签基本配置 用于配置对象交由Spring 来创建. 默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功. 基本属性: id:Bean实例在Spring容器中的唯一标识 class:Bean的全限定名称 Bean标签范围配置 scope:指对象的作用范围,取值如

  • Python入门教程之运算符重载详解

    目录 如何重载Python中的运算符 在 Python中重载比较运算符 重载相等和小于运算符 用于运算符重载的 Python 魔术方法或特殊函数 二元运算符 比较运算符 赋值运算符 一元运算符 运算符重载意味着赋予超出其预定义的操作含义的扩展含义.例如运算符 + 用于添加两个整数以及连接两个字符串和合并两个列表.这是可以实现的,因为 '+' 运算符被 int 类和 str 类重载.您可能已经注意到,相同的内置运算符或函数对不同类的对象显示不同的行为,这称为运算符重载. # Python 程序显示

  • Python一文入门Flask Blueprint SQLAlchemy部分详解

    目录 概述 安装准备 pipenv 开始实践 入口文件 路由 优化路由器 SQLAlchemy database类的定义 入口文件加载DB 模块中定义方法 在路由中的使用 SQLAlchemy实现mysql编码.列类型 默认值和索引设置 兼容Mysql列类型 自定义数据库名和字符集编码 概述 从安装Flask,pipenv 到路由实现,Blueprint.SQLAlchemy,一次简单实践,github地址,github.com/stark0824/s… 安装准备 python3 -V &&

  • Python入门基本操作列表排序用法详解

    目录 列表的举例 1.访问python列表中的元素 2.python列表的切片 3.python列表的排序 4.Python列表元素的添加 5.Python列表元素的删除 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现.列表的数据项可以是不同的类型,可以是字符串,可以是数字类型,甚至是列表,元组,只要用","逗号分隔开,就是一个元素. 列表的举例 1.访问python列表中的元素 通过索引直接访问元素,访问单个元素的基本格式为: 列表名[索引值]:访问多个元

  • C++入门语法之函数重载详解

    目录 写在前面 1 函数重载的概念 2 函数重载原理 总结 写在前面 关于C语言的编译与链接不懂的可以看一下下面的文章,先回顾一下以前的知识. 详解C语言的编译与链接 1 函数重载的概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 顺序)必须不同,常用来处理实现功能类似数据类型不同的问题. //1.函数的参数个数不同 #include <iostream> using namespace std; void

  • dubbo入门指南及demo实例详解

    目录 1. Dubbo是什么? 2. Dubbo能做什么? 3. dubbo的架构 4. dubbo使用方法. 服务提供者: 服务消费者: 1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Servi

随机推荐