首页 > 编程语言 >【C++】List

【C++】List

时间:2024-12-20 21:27:42浏览次数:9  
标签:迭代 1.2 List 元素 list C++ 插入 array

目录

1.1 list的介绍

1.2 list的使用

1.2.1 list的构造

1.2.2 list iterator的使用

1.2.3 list capacity

1.2.4 list element access

1.2.5 list modifiers

1.2.6 list的迭代器失效

2. list与vector的对比


1.1 list的介绍

1.2 list的使用

1.2.1 list的构造

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

1.2.2 list iterator的使用

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

【注意】 1. begin end 为正向迭代器,对迭代器执行 ++ 操作,迭代器向后移动 2. rbegin(end) rend(begin) 为反向迭代器,对迭代器执行 ++ 操作,迭代器向前移动

1.2.3 list capacity

函数声明 接口说明
empty 检测 list 是否为空,是返回 true ,否则返回 false
size 返回 list 中有效节点的个数

1.2.4 list element access

函数声明 接口说明
front 返回 list 的第一个节点中值的引用
back 返回 list 的最后一个节点中值的引用

1.2.5 list modifiers

函数声明 接口说明
push_front list 首元素前插入值为 val 的元素
pop_front 删除 list 中第一个元素
push_back list 尾部插入值为 val 的元素
pop_back 删除 list 中最后一个元素
insert list position 位置中插入值为 val 的元素
erase 删除 list position 位置的元素
swap 交换两个 list 中的元素
clear 清空 list 中的有效元素

1.2.6 list的迭代器失效

迭代器失效即迭代器所指向的节点的无 效,即该节点被删除了 。因为 list 的底层结构为带头结点的双向循环链表 ,因此 list 中进行插入 时是不会导致 list 的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭 代器,其他迭代器不会受到影响

void TestListIterator1()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    list<int> l(array, array+sizeof(array)/sizeof(array[0]));
    auto it = l.begin();
    while (it != l.end())
    {
        // erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给
        其赋值
        l.erase(it);
        ++it;
    }
}
// 改正
void TestListIterator()
{
    int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    list<int> l(array, array+sizeof(array)/sizeof(array[0]));
    auto it = l.begin();
    while (it != l.end())
    {
        l.erase(it++); // it = l.erase(it);
    }
}

2. listvector的对比

vector 与 list 都是 STL 中非常重要的序列式容器,由于两个容器的底层结构不同,导致其特性以及 应用场景不同,其主要不同如下:

vector list
动态顺序表,一段连续空间 带头结点的双向循环链表
访 支持随机访问,访问某个元素效率 O(1) 不支持随机访问,访问某个元 素效率 O(N)
任意位置插入和删除效率低,需要搬移元素,时间 复杂度为 O(N) ,插入时有可能需要增容,增容: 开辟新空间,拷贝元素,释放旧空间,导致效率更 任意位置插入和删除效率高, 不需要搬移元素,时间复杂度 O(1)
底层为连续空间,不容易造成内存碎片,空间利用 率高,缓存利用率高 底层节点动态开辟,小节点容 易造成内存碎片,空间利用率 低,缓存利用率低
原生态指针 对原生态指针 ( 节点指针 ) 进行 封装
在插入元素时,要给所有的迭代器重新赋值,因为 插入元素有可能会导致重新扩容,致使原来迭代器 失效,删除时,当前迭代器需要重新赋值否则会失 插入元素不会导致迭代器失 效,删除元素时,只会导致当 前迭代器失效,其他迭代器不 受影响
使 需要高效存储,支持随机访问,不关心插入删除效 大量插入和删除操作,不关心 随机访问

标签:迭代,1.2,List,元素,list,C++,插入,array
From: https://blog.csdn.net/L286594/article/details/144619756

相关文章

  • 【C++有点难】默认成员函数:构造函数
    默认成员函数有啥?总的来说嘞,有六种:构造函数,析构函数,拷贝构造函数,赋值重载函数,取地址重载函数其实我刚知道有六种的时候,也是很头大,但经过我不但地旁敲侧击,终于!我逐渐明白第一种:构造函数的神奇那学习之前,肯定要了解一下构造函数的概念吧?构造函数的概念:构造函数作为一种默认......
  • C++面向对象
    目录C++核心类和对象对象特性友元运算符重载继承多态文件读写C++核心类和对象类和对象类和对象是C++面向对象的基础,在C++中万事万物都是对象,C++利用类来实例化对象,下面是创建一个Circle类并实例化的语法://创建类classCircle{public:intm_r;voidgetM_......
  • C++STL与泛型编程
    目录C++提高编程模版STL初识StringVectorDequeStackQueueListSetPairMap其它函数对象谓词STL常见算法遍历算法查找算法排序算法拷贝和替换算法算术生成算法常见集合算法C++提高编程本阶段主要针对C++泛型编程和STL技术做详细讲解模版C++另一种编程思想称为泛型编程,主要利用......
  • [C++] 小游戏 能量 1.0.6 版本 zty出品
    目录前言演示用编译器及其标准编译器:DevC++6.7.5Redpanda 标准:C++14同款编译器下载点我能量1.0.6版本cpp文件下载点我                           先 赞 后 看  养  成 习 惯  ......
  • C++的interface与抽象类
    提示:文章文章目录前言一、背景二、C++的interface与抽象类c++有interface关键词吗?c++抽象类有abstract关键词吗?所以c++抽象类和abstract没有关系。那什么是抽象类?题目1题目2什么是抽象函数?抽象函数和纯虚函数的区别?纯虚函数和虚函数的区别三、extends和implements2.......
  • C++ 的头文件怎么给我一种接口的感觉?
    C++中的头文件确实可以被看作是一种接口(Interface),它们在C++程序设计中扮演着至关重要的角色。以下是头文件如何体现接口特性的几个方面:1.声明与定义分离接口(头文件):头文件中包含了类的声明、函数原型、模板声明等,它们定义了程序中可用的接口,但不包含具体的实现细节。实现(源......
  • C++中的智能指针:深入解析与实战案例
    C++中的智能指针:深入解析与实战案例在C++编程中,内存管理一直是一个核心且复杂的话题。手动管理内存不仅繁琐,而且容易出错,如内存泄漏、野指针等问题时常困扰着开发者。为了缓解这些问题,C++11引入了智能指针(SmartPointers),它们通过自动管理内存生命周期,极大地减少了内存管理......
  • 【C++基础】03、表达式 (判断语句与循环语句)
            一、判断语句        1.if 语句        2.switch 语句二、循环语句        1.for循环        2.while循环        3.do-while循环一、判断语句1.if 语句if语句是最基本的条件语句,它允许程序根据条......
  • 《 C++ 点滴漫谈: 十 》揭秘 C++ struct 的潜力:内存布局、继承、优化,你都掌握了吗?
    摘要本文全面解析了C++中的struct关键字,从其基本概念到高级应用,涵盖了struct的成员与访问控制、构造函数与析构函数、继承与多态,以及内存布局和现代C++的特性扩展。此外,文章详细探讨了struct与class的异同、与union的对比,并剖析了常见的误区与陷阱。结合丰富......
  • 初识C/C++内存结构
    希望本文有助于学习C++的同学们理解C++的内存结构路漫漫,道阻且长。文章目录一、C++的内存结构是什么?二、代码区二、常量存储区三、全局/静态存储区四、栈(Stack)区五、堆区六、各个内存区域之间的联系总结一、C++的内存结构是什么?C/C++不同于其他的语言的其中一......