首页 > 编程语言 >C++STL第五篇(链表List的使用方法)

C++STL第五篇(链表List的使用方法)

时间:2024-03-19 10:46:20浏览次数:24  
标签:容器 STL List 元素 list elem 链表 lst

list

链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。

List和vector是两个最常被使用的容器。List容器是一个双向链表。image-20240319093118592

  • 采用动态存储分配,不会造成内存浪费和溢出

  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素

  • 链表灵活,但是空间和时间额外耗费较大

list容器的迭代器

List容器不能像vector一样以普通指针作为迭代器,因为其节点不能保证在同一块连续的内存空间上。List迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取操作。所谓”list正确的递增,递减、取值、成员取用”是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取的是节点的成员。

List*有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效。这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效,甚至List元素的删除,也只有被删除的那个元素的迭代器失效,其他迭代器不受任何影响。

list是一个循环的双向链表

list<int> myList;
for (int i = 0; i < 10; i++) {
	myList.push_back(i);
}

list<int>::_Nodeptr node = myList._Myhead->_Next;

for (int i = 0; i < myList._Mysize * 2; i++) {
	cout << "Node:" << node->_Myval << endl;
	node = node->_Next;
	if (node == myList._Myhead) {
		node = node->_Next;
	}
}

这是C++11标准库下的写法,list<int>::_Nodeptr node = myList._Myhead->_Next;这句话不适用于其他版本。

构造函数

  1. 默认构造函数

    std::list<T> lst; // 创建一个空的列表 lst,其中 T 是列表中元素的类型。
    
  2. 区间构造函数

    std::list<T> lst(beg, end); // 将区间 `[beg, end)` 中的元素拷贝给列表 lst。
    
  3. 重复元素构造函数

    std::list<T> lst(n, elem); // 创建包含 n 个值为 elem 的元素的列表 lst。
    
  4. 拷贝构造函数

    std::list<T> lst2(lst); // 使用列表 lst 初始化列表 lst2,创建 lst 的副本。
    

修改操作

  • push_back(elem): 在容器尾部加入一个元素。
  • pop_back(): 删除容器中最后一个元素。
  • push_front(elem): 在容器开头插入一个元素。
  • pop_front(): 从容器开头移除第一个元素。
  • insert(pos, elem): 在 pos 位置插入 elem 元素的拷贝,返回新数据的位置。
  • insert(pos, n, elem): 在 pos 位置插入 n 个 elem 数据,无返回值。
  • insert(pos, beg, end): 在 pos 位置插入 [beg, end) 区间的数据,无返回值。
  • clear(): 移除容器的所有数据。
  • erase(beg, end): 删除 [beg, end) 区间的数据,返回下一个数据的位置。
  • erase(pos): 删除 pos 位置的数据,返回下一个数据的位置。
  • remove(elem): 删除容器中所有与 elem 值匹配的元素。

大小

  • size();//返回容器中元素的个数

  • empty();//判断容器是否为空

  • resize(num);//重新指定容器的长度为num,

若容器变长,则以默认值填充新位置。

如果容器变短,则末尾超出容器长度的元素被删除。

  • resize(num, elem);//重新指定容器的长度为num,

若容器变长,则以elem值填充新位置。

如果容器变短,则末尾超出容器长度的元素被删除。

其他

list<int> rlist = { 3,2,1,5,4 };
cout << "rlist.front:" << rlist.front() << endl;
cout << "rlist.back:" << rlist.back() << endl;
rlist.reverse();
// 使用迭代器遍历链表并输出元素
for (auto it = rlist.begin(); it != rlist.end(); ++it) {
	std::cout << *it << " ";
}
rlist.sort();

image-20240319103343257

标签:容器,STL,List,元素,list,elem,链表,lst
From: https://www.cnblogs.com/ivanlee717/p/18082202

相关文章

  • [Paper Reading] GLIDE: Towards Photorealistic Image Generation and Editing with
    GLIDE:TowardsPhotorealisticImageGenerationandEditingwithText-GuidedDiffusionModelsGLIDE(GuidedLanguagetoImageDiffusionforGenerationandEditing)时间:22/03机构:OpenAITL;DR本文研究使用DiffusionModel做图像生成过程,如何更好地加入conditional信息......
  • 【c++】string类---标准库(STL)中的string类
    主页:醋溜马桶圈-CSDN博客专栏:c++_醋溜马桶圈的博客-CSDN博客gitee:mnxcc(mnxcc)-Gitee.com目录1.STL(标准库)1.1什么是STL1.2STL的版本1.3 STL的六大组件1.4 STL的重要性1.5 如何学习STL6.STL的缺陷2.为什么要学习string类2.1C语言中的字符串2.2OJ中......
  • [学习记录]带头指针的单向链表的基本功能
    效果代码#include"stdio.h"#include"stdlib.h"typedefstructlinknode{ intdata; structlinknode*next;}LinkNode;LinkNode*CreateHeadNode(void);//创建头结点voidCreateNewNode(LinkNode*H);//创捷节点voidPrintList(LinkNode*H);//打印链表v......
  • C语言数据结构链表(无头结点)功能实现(增,删,改,查)
    #include<stdio.h>#include<stdlib.h>typedefstructLNode{   int data;   struct   LNode*next;}LNode,*LinkList; boolInitList(LinkList&L){    L=NULL;    return0; }boolinsert(LinkList&L,inti,intx){       ......
  • kodbox读取alist文件失败,问题解决过程
    让我先把相关的报错信息通过文字贴到下方,方便被检索出来出错了!(warning!)curlerrorcode=403;系统错误(explorer.editor.fileGet)explorer/editor.class.php[64]IO::fileSubstr(0,1,2)bin/data.bin[2][Linux6.2.0-35-generic/8.2.11/mysqli/1.49.10]在使用kodbbox......
  • 整理记录list(未完成)
    1.seurat4环境的安装代码2.conda安装知识的总结()https://www.jianshu.com/p/4c7b9127cf83conda常见报错conda-channel问题http://mp.weixin.qq.com/s?__biz=Mzg5MjY1MTU4Ng==&mid=2247484430&idx=1&sn=7df7c1d546ff5fce3e5d6e73f7569c2c&chksm=c03b9523f74c1c35e96bf287e959......
  • WPF —— ListBox控件、GroupBox控件详解
    1、ListBox介绍  ListBox是一个ItemsControl,这意味着它可以包含任何类型的对象的集合(,例如字符串、图像或面板)。  一个ListBox中的多个项是可见的,与仅ComboBox具有所选项可见的项不同,除非IsDropDownOpen属性为true。该SelectionMode属性确定一次是否......
  • L2-022 重排链表
    这道题真的烦,输出想半天。反正就是要区分奇偶,才能知道那个结点最后要打印出-1.我看网上遇到的都是测试点3的问题,不过我有问题的是测试点1,前三个出问题就是节点数奇偶的问题。#include<bits/stdc++.h>usingnamespacestd;map<int,pair<int,int>>mp;intmain(){ ints......
  • C语言动态链表练习(简单易懂)
    学习目标:初步认识动态链表,并会最基础的应用。题目内容:写个程序,输入a,b,c如果a>b,a=a➖b    b>c,b=b➖c    c>a,c=c➖a要求:开始时输入k➕1行数,第一行为k,代表数的组数,下面每一行为一个组,每组四个数,前三个为a,b,c,最后一个为这组数进行上述计算的次数题目特点分析:开始......
  • Sitecore ListManagaer Operation
    privatevoidListManagerOperate(){//获取服务IClientApiServiceclientApiService=ServiceLocator.ServiceProvider.GetRequiredService<IClientApiService>();//EXMmanagerrootidstringmanagerRoot=Settings.GetSetting(Global.ExmRoot,......