【C++】-- STL之list详解

2023-11-17

目录

list类

1.list类对象构造

2.迭代器

3.empty( )

4.size( ) 

5. front( )

6.back( )

7.push_front( )

8.pop_front( )

9.push_back( )

10.pop_back( )

11.insert( )

12.erase( )

13.swap( ) 

14.clear( )

15.remove( )

16.unique( )

17.sort( )

18.reverse( )


list类

 list有如下特征:

(1)优点:可在任意位置插入删除元素,插入删除元素效率高

(2)底层是双向链表,因此list可以前后双向迭代,通过指针连接前后节点。forward_list是单链表,只能向前迭代

(3)缺点:不支持任意位置随机访问;需要额外空间保存前后节点信息

1.list类对象构造

explicit list (const allocator_type& alloc = allocator_type());	//构造空list

explicit list (size_type n, const value_type& val = value_type(),//构造一个有n个元素值为val的list
                const allocator_type& alloc = allocator_type());

template <class InputIterator>//构造一个list,值为InputIterator的first到last之间的元素
  list (InputIterator first, InputIterator last,
         const allocator_type& alloc = allocator_type());
	list<int> l1;//构造空链表
	l1.push_back(1);
	l1.push_back(2);
	l1.push_back(3);

	list<int> l2(3,5);//构造一个元素为3个5的链表

	list<int> l3(l1.begin(), l1.end());//构造l3,以l1起始区间到终止区间的内容为元素
	
    //使用a的元素作为迭代区间进行构造
	int a[] = { 3,6,9,12 };
	list<int> l4(a, a+sizeof(a)/sizeof(a[0]));
	

2.迭代器

iterator begin();//正向迭代器,对迭代器++,迭代器向后移动
const_iterator begin() const;//正向const迭代器,对迭代器++,迭代器向前移动

reverse_iterator rbegin();//反向迭代器,对迭代器++,迭代器向后移动
const_reverse_iterator rbegin() const;//const反向const迭代器,对迭代器++,迭代器向前移动
    //链表不能使用[]进行元素访问,使用迭代器访问,打印l1
	list<int>::iterator it1 = l1.begin();
	while (it1 != l1.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;

	//链表不能使用[]进行元素访问,使用迭代器访问,打印l2
	list<int>::iterator it2 = l2.begin();
	while (it2 != l2.end())
	{
		cout << *it2 << " ";
		it2++;
	}
	cout << endl;

	//范围for进行遍历,也是用迭代器实现的,打印l3
	for (auto& e : l3)
	{
		cout << e << " ";
	}
	cout << endl;

	for (auto& e : l4)
	{
		cout << e << " ";
	}
	cout << endl;

 

将打印抽象出来:

template<class Con>
void PrintContainer(const Con& con)
{
	typename Con::const_iterator it = con.begin();
	while(it != con.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

3.empty( )

bool empty() const;//判断链表是否为空,为空返回true,否则返回flase
    cout << l4.empty() << endl;

4.size( ) 

size_type size() const;//求链表节点个数

 

5. front( )

返回第一个节点的引用 

      reference front();//返回第一个节点的引用
const_reference front() const;//返回第一个节点的const引用
    cout << l4.front() << endl;

6.back( )

返回最后一个节点的引用

      reference back();//返回最后一个节点的引用
const_reference back() const;//返回最后一个节点的const引用
    cout << l4.back() << endl;

7.push_front( )

在第一个节点前插入节点

    void push_front (const value_type& val);//在第一个元素前插入val
	l4.push_front(10);//在l4第一个元素位置插入10

	PrintContainer(l4);

8.pop_front( )

删除第一个节点

    void pop_front();//删除第一个节点
	l4.pop_front();//把l4的第一个节点删除

	PrintContainer(l4);

9.push_back( )

在链表末尾插入节点 

    void push_back (const value_type& val);//在链表末尾插入val
    l4.push_back(20);//在链表末尾插入20

	PrintContainer(l4);

10.pop_back( )

删除链表末尾节点

    void pop_back();//删除链表末尾节点
    l4.pop_back();//删除l4末尾节点
	
    PrintContainer(l4);

11.insert( )

 在某一位置插入节点

    iterator insert (iterator position, const value_type& val);//在某一位置插入值为val的节点
	list<int>::iterator pos = find(l4.begin(), l4.end(), 6);//查找6的位置

	l4.insert(pos, 100);//在6的位置插入100

	PrintContainer(l4);
	cout << *pos << endl;

迭代器没有失效: 

12.erase( )

    iterator erase (iterator position);//删除position位置的节点

 pos已经是6的位置了,删除6之后,pos就失效了,变成了野指针,再对pos解引用就会报错

	l4.erase(pos);
	PrintContainer(l4);
	cout << *pos << endl;

 需要在erase进行删除后,对迭代器重新赋值,pos就不会是野指针了,代码应该改成这样:

    l4.erase(pos);
	pos = find(l4.begin(), l4.end(), 12);
	PrintContainer(l4);
	cout << *pos << endl;

13.swap( ) 

交换两个同类型list的内容 

    void swap (list& x);//交换两个同类型list的内容
	l4.swap(l3);//交换l3和l4的内容
	cout << "l3:  ";
	PrintContainer(l3);
	cout << "l4:  ";
	PrintContainer(l4);

14.clear( )

清空list的内容

    void clear();//清空list的内容

	l4.clear();//清空l4的内容
	PrintContainer(l4);

15.remove( )

删除链表中所有指定值的节点 

    void remove (const value_type& val);//删除链表中所有值为val的节点

	list<int> l5;
	l5.push_back(1);
	l5.push_back(2);
	l5.push_back(2);
	l5.push_back(2);

	l5.remove(2);//删除所有值为2的节点

	PrintContainer(l5);

16.unique( )

去重,删除所有值相同的节点,只保留第一个 

    void unique();//每个节点的值只保留一个
    list<int> l6;
	l6.push_back(7);
	l6.push_back(2);
	l6.push_back(2);
	l6.push_back(3);
	l6.push_back(8);
	l6.push_back(8);
	l6.push_back(6);
	
	l6.unique();//去重

	PrintContainer(l6);

 注意:但是unique( )只对连续相同值的节点去重,如果节点不连续,就算节点值相同也不会去重

假如l6插入的节点,相同值不连续,unique就去重不了 :

	list<int> l6;
	l6.push_back(7);
	l6.push_back(8);
	l6.push_back(2);
	l6.push_back(3);
	l6.push_back(2);
	l6.push_back(8);
	l6.push_back(6);
	
	l6.unique();//去重,达不到目的,因为相同值不连续

	PrintContainer(l6);

所以unique( )必须和排序sort( )结合起来才能去重 

17.sort( )

 对链表节点排序

    void sort();//对链表节点排序
    list<int> l6;
	l6.push_back(7);
	l6.push_back(8);
	l6.push_back(2);
	l6.push_back(3);
	l6.push_back(2);
	l6.push_back(8);
	l6.push_back(6);
	
	l6.sort();
	PrintContainer(l6);

链表的排序基本没啥用,如果要排序,就存vector了 

18.reverse( )

对链表进行逆置

    void reverse();//逆置链表
	list<int> l6;
	l6.push_back(7);
	l6.push_back(8);
	l6.push_back(2);
	l6.push_back(3);
	l6.push_back(2);
	l6.push_back(8);
	l6.push_back(6);
	
	l6.sort();
	PrintContainer(l6);

 链表的许多操作,对于做OJ题很有用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】-- STL之list详解 的相关文章

  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • WebClient.DownloadDataAsync 冻结了我的 UI

    我在 Form 构造函数中的 InitializeComponent 之后有以下代码 using WebClient client new WebClient client DownloadDataCompleted new Downloa
  • 如何使用 ASP.NET MVC 编辑多选列表?

    我想编辑一个如下所示的对象 我希望用 UsersGrossList 中的一个或多个用户填充 UsersSelectedList 使用 mvc 中的标准编辑视图 我只得到映射的字符串和布尔值 下面未显示 我在 google 上找到的许多示例都
  • 元组在 VS2012 中如何工作?

    Visual Studio 2012 功能 tuples但不是可变参数模板 这是如何完成的 如何在不使用可变模板的情况下实现元组 简而言之 微软做了与之前在 NET 中实现类似元组的数据类型完全相同的事情 创建许多版本 每个版本都有固定数量
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 全局使用和 .NET Standard 2.0

    我最近意识到我可以使用 C 10 功能文件范围的命名空间在 NET Standard 2 0 项目中也可以通过设置
  • 为什么需要数字后缀?

    C 语言 我确信还有其他语言 需要在数字文字末尾添加后缀 这些后缀指示文字的类型 例如 5m是一个小数 5f是一个浮点数 我的问题是 这些后缀真的有必要吗 或者是否可以从上下文中推断出文字的类型 例如 代码decimal d 5 0应该推断
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 使用 C# 中的 Google 地图 API 和 SSIS 包获取行驶距离

    更新 找到了谷歌距离矩阵并尝试相应地修改我的代码 我在这里收到无效参数错误 return new GeoLocation dstnc uri ToString catch return new GeoLocation 0 0 https 基
  • Xamarin - SignalR 挂在连接上

    我正在尝试将我的 Xamarin 应用程序连接到托管在 Azure 上的 SignalR 后端 我遇到的问题是每次我在 HubConnection 上调用 StartAsync 时 它都会挂起客户端并且请求永远不会完成 我尝试通过应用程序进
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 在哪里可以下载没有 Visual Studio 2010 的 C# 4.0 编译器?

    我知道 CTP VS 2010 映像 但我可以只下载 NET Framework 4 0 和 C 编译器吗 AFAIK VS 2010 CTP 仅作为 VM 映像提供 我不相信 Microsoft 发布了 VS 的安装程序 其中一个绝对不适
  • “必须声明标量变量”错误[重复]

    这个问题在这里已经有答案了 必须声明标量变量 Id SqlConnection con new SqlConnection connectionstring con Open SqlCommand cmd new SqlCommand cm
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g

随机推荐

  • main() 方法为什么必须是静态的

    静态 如果您声明方法 子类 块或静态变量 则将其与类一起加载 在Java中 只要需要调用 实例 方法 就应该实例化 包含它的 类并调用它 如果我们需要不实例化地调用方法 则它应该是静态的 此外 静态方法与类一起被加载到内存中 对于main方
  • EduSoho网校系统安装教程(三):nginx配置

    Ubuntu下nginx的配置 安装nginx sudo apt get install nginx 配置Nginx sudo vim etc nginx nginx conf 在http 添加 client max body size 1
  • mysql复制表的几种方式

    mysql复制表的几种方式 所描述的方法还请实际测试一下再使用 1 复制表结构及数据到新表 CREATE TABLE 新表SELECT FROM 旧表 这种方法会将oldtable中所有的内容都拷贝过来 当然我们可以用delete from
  • Exception对性能的影响

    我们知道 当程序发生异常时 会通过new调用异常的构造方法 在堆内存区域创建一个异常实例 而构造方法都是默认调用基类的Throwalbe的构造方法 下面我们看一下代码 public Throwable fillInStackTrace pu
  • webpack4 devserver 如何拦截请求 添加请求headers

    v4官网 https v4 webpack docschina org configuration dev server devserver proxy devServer 配置 devServer host 127 0 0 1 https
  • 使用ffmpeg将mp4转为m3u8并播放

    ffmpeg 下载地址 https ffmpeg zeranoe com builds 这个是我自己的ffmpeg 有积分的大佬可以任性下载 ffmpeg压缩包 下载解压之后需要将ffmpeg添加到环境变量中 cmd中输入 ffmpeg v
  • R语言与数据分析实战4-变量的创建与修改

    第1关 创建新变量 在进行实际的数据分析时 我们会经常需要创建新变量或者为当前存在的变量变换新的取值 这就好比你是一个厨师 现在你要创新菜式 需要做一些新的厨房模具或者是改良当前已有的厨具来进行烹饪 对于创建新变量 其实原理非常简单 大家只
  • shell-2-文本处理工具

    主题 文本处理工具 一 grep grep 全局搜索正则表达式 固定字符表示通用匹配 whatis grep man grep 查看grep用法 正则表达式分为两种 传统 扩展正则表达式 对应的 有两个命令 grep 传统 和 egrep
  • nginx应用指南

    一 nginx基本简述 最新更新 请点击这个里1 概念 nginx是一个开源且高性能 可靠的HTTP中间件 代理服务 开源 直接获取源代码 高性能 支持海量并发 2 nginx应用场景 静态处理 反向代理 负载均衡 资源缓存 安全防护 访问
  • Gson解析JSON数据中动态未知字段key的方法

    有时在解析json数据中的字段key是动态可变的时候 由于Gson是使用静态注解的方式来设置实体对象的 因此我们很难直接对返回的类型来判断 但Gson在解析过程中如果不知道解析的字段 就会将所有变量存储在一个Map中 我们只要实例化这个ma
  • 严格模式和非严格模式区别

    严格模式和非严格模式有什么区别 严格模式对正常的 JavaScript语义做了一些更改 首先 严格模式通过抛出错误来消除了一些原有静默错误 其次 严格模式修复了一些导致 JavaScript引擎难以执行优化的缺陷 有时候 相同的代码 严格模
  • mutex 互斥

    文章目录 互斥 mutex 类 要求 公共方法 注意 lock unlock try lock 相关参考 互斥 互斥算法避免多个线程同时访问共享资源 这会避免数据竞争 并提供线程间的同步支持 mutex 类 mutex 类是能用于保护共享数
  • 【程序开发】手把手教你写一个Python爬虫

    经常听音乐的的人有一个苦恼 很多自己喜欢的歌曲 因为各种原因无法进行免费下载 很多人没办法 只能咬咬牙开个会员 都是自己辛苦挣的人民币啊 幸好 我们还有爬虫 通过爬虫 我们可以很轻易 很快速的获取互联网上的资源 不管是音乐视频 还是工作和商
  • PPPoE协议详解

    PPPoE协议详解 PPPoE协议的工作流程包含发现和会话两个阶段 发现阶段是无状态的 目的是获得PPPoE终结端 在局端的ADSL设备上 的以太网MAC地址 并建立一个惟一的PPPoESESSION ID 发现阶段结束后 就进入标准的PP
  • 非系统盘安装linux,Windows10 Linux子系统安装/迁移到非系统盘(示例代码)

    oboth DESKTOP BUFOEB1 mnt c Users luoz mnt d LxRunOffline exe 一 通过wsl命令迁移 备份Linux分发 操作步骤 wsl exe 命令用法 wsl h 命令行选项无效 h 版权
  • 子串和子序列问题-动态规划向

    1 子串子序列问题概述 有关于子序列和子串的问题是字符串或者数组经常会遇到的问题 一般我们经常使用多指针 滑动窗口 回溯 动态规划的方式去解决 而本篇重点关注能用动态规划解决或者说明显使用动态规划解决的子串问题和子序列问题 1 1 子串 子
  • <string>库和<cstring>库常用函数

    库和库常用函数 void memcpy void p1 const void p2 size t n void memset void p int v size t n char strcpy char p1 char p2 char st
  • canvas arcTo()用法详解

    arcTo x1 y1 x2 y2 radius arcTo 方法将利用当前端点 端点1 x1 y1 和端点2 x2 y2 这三个点所形成的夹角 然后绘制一段与夹角的两边相切并且半径为radius的圆上的弧线 弧线的起点就是当前端点所在边与
  • c语言经典代码实现0-100的和

    include
  • 【C++】-- STL之list详解

    目录 list类 1 list类对象构造 2 迭代器 3 empty 4 size 5 front 6 back 7 push front 8 pop front 9 push back 10 pop back 11 insert 12 e