C++ STL:list用法详解

C++ STL list的初始化、添加、遍历、插入、删除、查找、排序、释放 list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。 使用list容器之前必须加上STL的list容器的头文件:#include; list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using nam 阅读详情

list容器介绍

相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间。也就是说,对于任何位置的元素插入或删除,list永远是常数时间。

常用函数

(1)    构造函数

list<Elem> c:创建一个空的list

list<Elem> c1(c2):复制另一个同类型元素的list

list<Elem>c(n):创建n个元素的list,每个元素值由默认构造函数确定

list<Elem>c(n,elem):创建n个元素的list,每个元素的值为elem

list<Elem>c(begin,end):由迭代器创建list,迭代区间为[begin,end)

(2)    大小、判断函数

Int size() const:返回容器元素个数

bool empty() const:判断容器是否为空,若为空则返回true

(3)    增加、删除函数

void push_back(const T& x):list元素尾部增加一个元素x

void push_front(const T& x):list元素首元素钱添加一个元素X

void pop_back():删除容器尾元素,当且仅当容器不为空

void pop_front():删除容器首元素,当且仅当容器不为空

void remove(const T& x):删除容器中所有元素值等于x的元素

void clear():删除容器中的所有元素

iterator insert(iterator it, const T& x ):在迭代器指针it前插入元素x,返回x迭代器指针

void insert(iterator it,size_type n,const T& x):迭代器指针it前插入n个相同元素x

void insert(iterator it,const_iterator first,const_iteratorlast):把[first,last)间的元素插入迭代器指针it前

iterator erase(iterator it):删除迭代器指针it对应的元素

iterator erase(iterator first,iterator last):删除迭代器指针[first,last)间的元素

(4)    遍历函数

iterator begin():返回首元素的迭代器指针

iterator end():返回尾元素之后位置的迭代器指针

reverse_iterator rbegin():返回尾元素的逆向迭代器指针,用于逆向遍历容器

reverse_iterator rend():返回首元素前一个位置的迭代器指针

reference front():返回首元素的引用

reference back():返回尾元素的引用 

(5)    操作函数

void sort():容器内所有元素排序,默认是升序

template<class Pred>void sort(Pred pr):容器内所有元素根据预断定函数pr排序

void swap(list& str):两list容器交换功能

void unique():容器内相邻元素若有重复的,则仅保留一个

void splice(iterator it,list& li):队列合并函数,队列li所有函数插入迭代指针it前,x变成空队列

void splice(iterator it,list& li,iterator first):队列li中移走[first,end)间元素插入迭代指针it前

void splice(iterator it,list& li,iterator first,iterator last):x中移走[first,last)间元素插入迭代器指针it前

void reverse():反转容器中元素顺序

基本操作示例:

#include "stdafx.h"
#include<iostream>
#include<string>
#include<list>
using namespace std;
typedef list<string> LISTSTR;

int _tmain(int argc, _TCHAR* argv[])
{
<span style="white-space:pre">	</span>LISTSTR test;
<span style="white-space:pre">	</span>test.push_back("back");
<span style="white-space:pre">	</span>test.push_back("middle");
<span style="white-space:pre">	</span>test.push_back("front");

<span style="white-space:pre">	</span>cout<<test.front()<<endl;
<span style="white-space:pre">	</span>cout<<*test.begin()<<endl;


<span style="white-space:pre">	</span>cout<<test.back()<<endl;
<span style="white-space:pre">	</span>cout<<*(test.rbegin())<<endl;


<span style="white-space:pre">	</span>test.pop_front();
<span style="white-space:pre">	</span>test.pop_back();


<span style="white-space:pre">	</span>cout<<test.front()<<endl;
<span style="white-space:pre">	</span>return 0;
}
程序运行结果如下:

从上述代码可以看出list首尾元素的增加和删除都是非常容易的,test.front()相当于string& s=test.front(),返回了首元素的引用;test.begin()相当于list<string>::iterator it=test.begin(),返回了首元素的迭代器指针,因此test.front()于*test.begin()的结果是一致的。
#include "stdafx.h"
#include<iostream>
#include<string>
#include<list>
using namespace std;
typedef list<int> LISTINT;

int _tmain(int argc, _TCHAR* argv[])
{
	LISTINT test;
	for(int i=0;i<5;i++)
	{
		test.push_back(i+1);
	}

	LISTINT::iterator it = test.begin();
	for(;it!=test.end();it++)
	{
		cout<<*it<<"\t";
	}
	cout<<endl;

	//reverse show
	LISTINT::reverse_iterator rit = test.rbegin();
	for(;rit!=test.rend();rit++)
	{
		cout<<*rit<<"\t";
	}
	cout<<endl;
	return 0;
}
程序运行结果如下:

正向迭代器与逆向迭代器表示形式是不一样的,前者是iterator,后者是reverse_iterator。逆向显示并不会改变元素在容器中的位置,只是逆向显示。
#include "stdafx.h"
#include<iostream>
#include<string>
#include<list>
using namespace std;
typedef list<int> LISTINT;

int _tmain(int argc, _TCHAR* argv[])
{
	LISTINT test;
	test.push_back(1);
	test.push_back(5);
	test.push_back(3);
	test.push_back(10);

	LISTINT test2;
	test2.push_back(2);
	test2.push_back(8);
	test2.push_back(6);
	test2.push_back(9);

	test.sort();
	test2.sort();

	test.merge(test2);

	for(LISTINT::iterator it = test.begin();it!=test.end();it++)
	{
		cout<<*it<<"\t";
	}
	cout<<endl;
	cout<<test.size()<<"\t"<<test2.size()<<endl;
	return 0;
}
上面的代码展示了sort merge和splice的使用,程序运行结果如下:

从允许结果可以看出,两个链表merge合并前,一般都已经俺升序排好序,合并后的链表仍然是升序排列。merge操作是数据移动操作,不是复制操作,因此t1.merge(t2)表示把test2中所有元素依次移动并插入到源链表test的适当位置,test增加了多少个元素,test2就减少了多少个元素。若用test.splice(test.begin(),test2)代替程序中的test.merge(test2),其余不变,就能看出splice的特点。splice()完成的是拼接功能,也是数据移动操作,不慎复制操作。test.splice(test.begin(),test2)表明把test2中所有元素整体地移动到原始链表test的首元素前,test增加了多少个元素,test2就减少了多少个元素。如上述代码所述,test,test2排序后,test={1,3,5,10},test2={2,6,8,9}. test.splice(test.begin(),test2)后,test={2,6,8,9,1,3,5,10},test2={};test.merge(test2)后,test={1,2,3,5,6,8,9,10},test2={}




C++中STL用法超详细总结 目录 1 什么是STL? 2 STL内容介绍 2.1 容器 2.2 STL迭代器 2.3 算法 2.4 仿函数 2.4.1 概述 2.4.2 仿函数(functor)在编程语言中的应用  2.4.3 仿函数在STL中的定义 2.5 容器适配器 2.5.1 stack 2.5.2 queue &amp; priority_queue 3 常用容器用法介绍  3.1 vec... 阅读详情

相关推荐

【C++STL基础入门】list改、查操作

C++标准模板库(STL)是C++语言中非常重要的部分,它提供了一组通用的模板类和函数,用于处理常见的数据结构和算法问题。其中之一是list(链表),它是一种双向链表容器,提供了高效的插入和删除操作。本文将介绍如何使用C++ STL中的list进行改和查操作。list的改操作:在list中进行改操作主要包括插入(Insert)、删除(Erase)和替换(Replace)等操本文介绍了在C++ STL中使用list进行改和查操作的基本方法。通过插入、删除和替换操作,可以对list的内容进行修改。

m0_62599305的博客 2656

list用法

本文为转载文章 1.关于list容器 list是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。list的实现大概是这样的:list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域...

ShineEternal的笔记小屋 679

C++ list 查找

#include <iostream> #include <list> #include <algorithm> using namespace std; int main() {   list<int> list1;   for (int k=0;k<10;k++)   {     list1.push_back(k);   }   for (int k=0;k<10;k++)   {     list1.insert(list1.end

我不是码农的博客~~~ 3076

STL之四:list用法详解

list容器介绍 相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间。也就是说,对于任何位置的元素插入或删除,list永远是常数时间。 常用函数 (1)    构造函数 list c:创建一个空的list list c1(c2):复制另一个同类型元素的list

longshengguoji的专栏 2万+

2025虚幻游戏逆向工程解包尝试

2025虚幻游戏逆向工程解包指南 本文详细介绍了虚幻引擎5游戏逆向解包的完整流程,主要包括获取AES密钥、生成映射文件和导出资源三个关键步骤。作者在实际操作中遇到诸多难题:AES密钥获取工具存在加壳保护问题,映射文件生成器依赖复杂的VS编译环境,DLL注入工具的使用也存在技术门槛。通过多次尝试,作者发现部分游戏可直接搜索现成的AES密钥,而映射文件生成需要额外下载Memcury依赖库才能正常编译。文章提供了相关工具的下载链接和具体操作说明,但同时也指出每个环节都可能出现意外状况,逆向工程实际执行过程远比理论

wsdchong的博客 6154

Mac用户看过来!M1/M2芯片安装CiteSpace完整指南(从Homebrew到成功运行)

本文为Mac M1/M2芯片用户提供CiteSpace安装的完整指南,从Homebrew安装适配的Java环境到最终成功运行CiteSpace。详细步骤包括环境检查、Java配置、CiteSpace下载与优化,解决常见问题如内存分配、图形渲染和中文显示乱码,确保科研人员能顺利使用这一文献可视化工具。

weixin_42530458的博客 308

C++ STL标准库: std::list使用介绍、用法详解

文章目录0. std::list 简介1 std::list 定义对象2 std::list添加元素3 std::list删除元素4 std::list容器容量5 std::list迭代器6 std::list判断是否为空7 std::list元素的存取和访问8 std::list元素重置9 std::list 交换两个容器的内容10 std::list元素的插入和删除11 std::list运算符函数12 std::list merge()和sort()13 std::list remove() 和 re

超级大洋葱的博客 11万+

STM32实战篇:使用USART发送/接收数据

在发送字符时也可以直接使用其对应的ASCLL码,例如: USART_SendData(USART1, 0x61);

qq_74114817的博客 596

C++ STL 中的 list 容器:用法与实现详解

链表作为一种动态结构,能够根据需要的在运行时灵活的插入、删除数据元素,而且它对储存单元没有过高的要求,不一定要求核内存是连续的、整块单元。相对于数组、字符串,由于 链表存储不连续,因此不能实现对它的随机访问。在链表中查找、定位数据元素效率较低。无论如何,在很多问题中,链表还是能大展身手的,并高效的解决问题。链表(Linked List)是一种线性数据结构,由一系列**节点(Node)**组成。每个节点包含两个部分:数据域:存储实际的数据。指针域:存储指向下一个节点(或上一个节点)的地址。

m0_59858691的博客 1729

嵌入式人工智能(18-基于树莓派4B的继电器JQC-3FF-S-Z)

本次实验的输出端控制不会接强电,就用LED灯来模拟即可,由于我那个流水灯模块是低电平点亮,所以接线稍有不同,同学们注意。只有继电器吸合,输出端的NO与COM就导通,给LED低电平然后就亮,否则继电器断开,NO与COM不导通,LED不亮。原理都一样,控制电流的接通与断开,这个模块看起来还简单点,毕竟还有2个指示灯,下端IN如接上电源红灯亮,继电器动作有电流通过绿灯亮。在实际应用中,可以通过编程控制继电器的通断状态,例如在Python编程中设置继电器模块的通断时间,从而实现自动化控制。

u010152658的博客 2531

宋浩线性代数笔记

Miao-A-SongHao-Linear-Algebra-Notes bilibili 宋浩老师 “惊叹号” 系列 《线性代数》网课 笔记及时间点目录 Github项目地址:https://github.com/cy69855522/Miao-A-SongHao-Linear-Algebra-Notes ???? 前言 我发现吧,线代没记笔记真不行。 浩浩学习,天天向上。数学网课推荐????宋浩老师的免...

Knife丶小刀博客 4万+

[转] C++ STL标准库: std::list使用介绍、用法详解

https://blog.youkuaiyun.com/u014779536/article/details/111301635

sroman的博客 4631

Python爬虫实战:基于Playwright与异步技术的专利数据抓取系统

专利数据是企业技术创新、市场竞争分析和行业趋势预测的关键情报来源。然而,专利数据通常分散在各个国家的专利局网站,数据结构复杂,反爬机制严格,使得高效抓取成为技术挑战。本文将详细介绍如何构建一个基于最新Python技术的专利数据抓取系统,涵盖Selenium的现代化替代方案Playwright、异步编程、智能代理轮换等高级技术。

2201_76125261的博客 1562

C++ STL 之 list 与 forward_list 详解:用法→原理→面试

本文详细介绍了C++ STL中的链表容器list和forward_list的使用方法、核心原理及面试要点。list是双向链表,forward_list是单向链表,主要优势是O(1)时间复杂度的任意位置插入/删除操作。 内容分为三部分:首先讲解初始化、元素访问、增删改查等基础用法;然后重点解析list的核心操作splice,它能在O(1)时间内移动节点;最后给出面试常见问题的解答。文中包含大量代码示例和图解说明,特别适合C++开发者系统学习链表容器的特性和底层实现原理。 (字数:150字)

Rick_Theseusr的博客 373

8.2 发展趋

分子泵技术正处在一个快速变革的时代,面对日益增长的应用需求和不断涌现的技术挑战,其发展呈现出多元化、智能化和高度集成化的趋势。这些发展趋势不仅代表着技术创新的方向,也预示着分子泵在未来工业体系中将要扮演的更加重要的角色。

技术工作者 116

02-Redis 核心特性与数据结构详解:揭秘高性能的技术内核

本文深度拆解 Redis 高性能的技术内核:揭秘其凭“内存存储 + C 语言开发” 实现微秒级延迟、10 万 + QPS 的性能优势;详解 5 种基础数据类型(String/Hash 等)与 4 种扩展数据类型(Stream/Geospatial 等)的特性及场景;还介绍多语言支持、RDB/AOF 持久化、主从复制 / 哨兵 / 集群等高可用方案,助读者掌握 Redis 技术核心与实践逻辑。

蜗牛老师,专注编程领域 996

C++学习 STL之四:list用法详解

list容器介绍 相对于vector容器的连续线性空间,list是一个双向链表,它有一个重要性质:插入操作和删除操作都不会造成原有的list迭代器失效,每次插入或删除一个元素就配置或释放一个元素空间。也就是说,对于任何位置的元素插入或删除,list永远是常数时间。 常用函数 (1)    构造函数 list c:创建一个空的list list c1(c2):复制另一个同类型元素的list

skdkjxy的专栏 983

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++:STL-容器、算法、迭代器知识点与用法详解-list、set/multiset、pair(3)

本文重点对C++STL的list容器和set容器、multiset、pair容器知识点、函数相关用法进行详解。

Bellwen的博客 539

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++ STL核心组件解析:容器、迭代器与算法实战指南

在C++编程中,数据结构与算法是构建高效软件的基础。STL(Standard Template Library)作为C++标准库的核心组成部分,通过泛型编程思想,将常用的数据结构和算法抽象为可复用的模板组件。其设计原理基于容器、迭代器、算法的分离,实现了数据存储与操作的解耦,从而提升代码的通用性和性能。这一设计使得开发者能够专注于业务逻辑,而非底层实现细节,极大地提高了开发效率和代码质量。在工程实践中,STL的容器如vector、map等,配合迭代器和泛型算法,能够应对数组操作、查找排序、内存管理等高频需求

weixin_30883311的博客 406

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ STL list双向链表:核心特性、性能对比与实战应用详解

在C++标准模板库(STL)中,容器是数据存储与管理的核心组件。vector凭借连续内存布局提供了高效的随机访问,但在频繁插入删除场景下性能受限。双向链表作为一种基础数据结构,通过节点指针链接实现元素逻辑串联,其核心优势在于任意位置的常数时间插入删除操作,无需移动其他元素。这一特性在需要稳定迭代器或处理大型对象的工程实践中价值显著,例如实现LRU缓存淘汰算法、消息队列或实时事件处理系统。本文聚焦std::list,深入解析其基于双向链表的内部结构、迭代器失效规则,并通过性能对比揭示其与vector的适用边界

weixin_29758911的博客 246

C++中的List容器用法详解

在C++中,可以使用多种方式创建和初始化listlist是C++标准模板库中非常强大的容器之一,它提供了快速的插入和删除操作,并且支持双向迭代。通过本文的介绍,你应该对list的基本用法有了一个大致的了解。在实际编程中,根据具体需求选择合适的容器是非常重要的,list适合于那些需要频繁插入和删除元素的场景。希望这篇文章能够帮助你更好地理解和使用C++中的list容器。如果你有任何问题或需要进一步的解释,请随时在评论区留言。

Q741_147的博客 2534

C++STL(2) list容器汇总

std::list是C++标准库提供的双向链表容器。与不同,std::list不是基于连续内存存储元素的,而是通过指针链接各个元素。这使得std::list在插入和删除元素时具有更好的性能,但在随机访问元素时性能较差。下面是std::list双向链表std::list的元素以双向链表的形式存储,每个元素都包含指向前一个元素和后一个元素的指针。插入和删除:由于链表的特性,std::list在插入和删除元素时效率很高,不需要移动其他元素。插入和删除操作的时间复杂度为O(1)。无需重新分配内存....

WDJ54068923的博客 196

C++STL之list的使用详解

list为双向链表,即struct中包含一个数据和两个指针,分别指向前一个节点和后一个节点。在堆上分配空间,每插入一个元素都会分配空间,每删除一个元素都会释放空间;插入、删除时间复杂度为O(1)。

请叫我皮皮虾的博客 1881

c++ list, vector, map, set 区别与用法比较

c++ list, vector, map, set 区别与用法比较 原文链接:https://www.cnblogs.com/smiler/p/4457622.html List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。 Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到

CL820211的博客 317

【总结】C++ 基础数据结构 —— STL之链表(list)用法详解

文章目录一、list 的介绍二、list 的基本操作三、list 的用法 一、list 的介绍 list 是 STL 中的一个序列容器,实现的是双向链表,每个元素都有两个指针,分别指向元素的前驱和后继。 list 不需要指定内存大小,因为他存储在不连续的内存空间中,并由指针将他们连接在一起。 由于链表的特点,不能进行内部的随机访问,无法通过位置来访问元素,即不支持[ ] 操作符和ve...

360°顺滑 2万+

【C++】STL中的list容器详解及常用函数用法

list高效插入和删除:在已知位置插入或删除元素的时间复杂度为 O(1),远高于vector的 O(n)。不支持随机访问:与数组不同,list不支持通过下标访问,因此需要通过迭代器进行遍历。双向链表:支持从头部和尾部同时遍历,方便实现一些特定算法。

weixin_74837455的博客 2731
上一篇: 二叉树的递归和非递归遍历方法
下一篇: 判断二叉树是否平衡
moses1213
博客等级 码龄12年 56粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值