首页 > 其他分享 >list容器---深入探索STL中的双向链表

list容器---深入探索STL中的双向链表

时间:2024-08-30 21:50:35浏览次数:5  
标签:std 容器 删除 STL 元素 list 链表 lst

目录

一、引言

二、list容器原理

三、list容器的常用操作

   1.创建list容器

   2.添加元素

   3.删除元素

   4.访问元素

   5.遍历list容器

四、list容器的优缺点

五、实际应用场景

六、总结


        本文将详细介绍C++ STL中的list容器,包括其原理、常用操作、优缺点以及实际应用场景,帮助读者更好地理解和运用list容器。

一、引言

        在C++编程中,容器是STL(Standard Template Library,标准模板库)的重要组成部分,它们为程序员提供了方便的数据管理方式。list容器是STL中的一种双向链表实现,它支持高效的插入和删除操作。本文将带你深入了解C++ list容器。

二、list容器原理

        list容器是一种序列容器,底层采用双向链表的数据结构。每个元素都包含一个节点,节点中包含数据值和两个指向前后节点的指针。这种结构使得list容器在插入和删除操作时非常高效,因为不需要像数组或vector那样进行大量的元素移动。

三、list容器的常用操作

   1.创建list容器

#include <list>

std::list<int> lst; // 创建一个空的list容器
std::list<int> lst2(10, 1); // 创建一个包含10个元素,每个元素值为1的list容器

   2.添加元素

lst.push_back(1); // 在容器末尾添加元素
lst.push_front(2); // 在容器开头添加元素
lst.insert(lst.begin(), 3); // 在指定位置插入元素

   3.删除元素

lst.pop_back(); // 删除容器末尾的元素
lst.pop_front(); // 删除容器开头的元素
lst.erase(lst.begin()); // 删除指定位置的元素
lst.remove(1); // 删除容器中所有值为1的元素

   4.访问元素

std::list<int>::iterator it = lst.begin();
std::advance(it, 2); // 将迭代器it前进2个位置
int value = *it; // 访问元素

   5.遍历list容器

for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
    std::cout << *it << std::endl;
}

四、list容器的优缺点

优点:

  • 插入和删除操作非常高效,时间复杂度为O(1)。
  • 不需要连续的内存空间,可以动态扩展。

缺点:

  • 随机访问效率低,时间复杂度为O(n)。
  • 相比于vector,list容器占用更多的内存空间。

五、实际应用场景

list容器适用于以下场景:

  • 需要频繁进行插入和删除操作的场景。
  • 不需要随机访问元素的场景。
  • 数据量较小,内存空间不是主要考虑因素的场景。

六、总结

        本文详细介绍了C++ list容器的原理、常用操作、优缺点以及实际应用场景。了解和掌握list容器,可以让程序员在开发过程中更加灵活地选择合适的容器,提高程序的性能和可维护性。在实际编程中,应根据具体需求来选择使用list容器。

标签:std,容器,删除,STL,元素,list,链表,lst
From: https://blog.csdn.net/2201_75782847/article/details/141728231

相关文章

  • 题解:CF916D Jamie and To-do List
    题意维护一个数据结构,支持以下几种操作:setaixi:设置任务\(a_i\)的优先级为\(x_i\),如果该列表中没有出现则加入该任务。removea_i:删除该任务。querya_i:求优先级比\(a_i\)小的任务个数,如果没有则输出\(-1\)。undosum:删除此次操作之前的\(sum\)次操作。分析前......
  • 代码随想录算法训练营,8月30日 | 203.移除链表元素, 707.设计链表, 206.反转链表
    链表理论基础1.单链表:数据域和指针域(指向下一个结点的位置)组成,头结点,结尾为空指针;双链表:多了一个指向前一个结点的指针;循环链表:结尾指向头结点。2.链表在内存中的存储不是顺序的,跟数组不同,要找一个数据只能通过前一个数据来找,所有这就导致链表的查询比数组麻烦,但是插入删除数据......
  • 【Qt笔记】QListView控件详解
     目录引言一、QListView基本概念1.1定义与功能1.2架构原理二、QListView基本使用2.1创建QListView和Model2.2设置QListView的属性2.3处理用户交互三、QListView高级技巧3.1自定义委托3.2使用QStandardItemModel3.3实现拖放功能四、QListView......
  • python嵌套列表(Nested List)
    题目要求:        给定每个学生的姓名和成绩,将它们存储在嵌套列表中,并打印出成绩第二低的学生的姓名。如果有多个学生成绩第二低,则按字母顺序打印他们的姓名。使用到的函数:set()        将成绩列表转换为集合,集合自动去重,因此相同的成绩只会出现一次。 ......
  • 顺序表和链表知识点
    1顺序表顺序表是指用一段物理地址连续的空间去存储数据的线性结构。顺序表有两种:静态顺序表,动态顺序表。1.1静态顺序表结构体定义typedefintElemDataSL;typedefstructSequeList{ ElemDataSLarr[100]; intsize;}SL;静态顺序表在创建结构体的时候就已经把......
  • C++第十四弹 -- STL之queue和priority_queue深度剖析
    目录前言1.queue的介绍与使用1.1.queue的介绍1.2为什么容器类不选vector?1.3queue的使用1.4OJ用队列实现栈2.queue的模拟实现3.deque的介绍3.1什么是适配器3.2STL标准库中stack和queue的底层结构3.3deque的简单介绍4.priority_queue的介绍与使用4.1介绍4.2......
  • 分享丨【题单】链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)
    作者:灵茶山艾府链接:https://leetcode.cn/circle/discuss/K0n2gO/一、链表注:由于周赛中的链表题可以转成数组处理,难度比直接处理链表低,故不标明难度分。带着问题去做下面的题目:在什么情况下,要用到哨兵节点(dummynode)?在什么情况下,循环条件要写while(node!=null)?什么情况......
  • 代码随想录算法day3 - 链表1
    题目1203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。示例1:输入:head=[1,2,6,3,4,5,6],val=6输出:[1,2,3,4,5]示例2:输入:head=[],val=1输出:[]示例3:输入:head=[7,7,7,7],v......
  • C++学习随笔——C++11的array、forward_list、tuple的用法
    1.std::arraystd::array是C++11引入的一个封装了原生数组的容器,它结合了C++标准库容器的优点和C风格数组的效率。#include<array>#include<iostream>intmain(){std::array<int,5>arr={1,2,3,4,5};//初始化一个大小为5的数组//访问元素......
  • 数据结构-单链表-详解-1
    数据结构-单链表-详解-11.前言2.结点3.打印3.1关于断言3.2下一结点的找法物理结构逻辑结构1.前言在数据结构-顺序表-详解中,我详细介绍了顺序表的实现,而顺序表也有一些缺点:中间,头部插入时,需整体挪动数据,效率低下。空间不够时扩容,有一定的消耗,也可能有一定空间浪费......