欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

带你读文档学习list容器

时间:2023-04-26
list

一、list介绍二、list常用接口

1.构造list相关接口2.迭代器相关接口3.容量相关接口4.取值相关接口5.增删改相关接口 三、list的迭代器失效问题 一、list介绍

list是序列容器,允许在序列中的任何位置进行常数时间复杂度的插入和删除操作,以及双向迭代。

底层实现为双向链表;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。

与其他序列容器(array,vector,deque)相比,list在容器内任何位置插入、提取和移动元素的性能通常更好。

与这些其他序列容器相比,列表和 forward_list 的主要缺点是它们无法通过下标直接访问元素;例如,要访问列表中的第六个元素,必须从已知位置(如开头或结尾)迭代到该位置,这会花费线性时间。它们还消耗一些额外的内存来保持与每个元素相关联的链接信息(这对于小型元素的大型列表可能是一个重要因素)。

二、list常用接口 1.构造list相关接口

文档中的例子十分精干:

2.迭代器相关接口




begin返回第一个元素的迭代器
end返回最后一个元素的下个位置的迭代器,即头结点的迭代器




rbegin 返回最后一个元素的迭代器
rend 返回第一个元素的前一个位置的迭代器,即头结点的迭代器

正向迭代器++,向后移动,反向迭代器++,向前移动

3.容量相关接口 4.取值相关接口


返回list的第一个节点中值的引用


返回list的最后一个节点中值的引用

5.增删改相关接口


各接口的参数格式:





交换两list对象的内容,交换时候其实改变指针指向就可以达到目的,代价不大。

三、list的迭代器失效问题

在list中进行插入是不会导致list的迭代器失效的,只有在删除时迭代器才会失效。

void TestListIterator1(){ int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; list 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 l(array, array+sizeof(array)/sizeof(array[0])); auto it = l.begin(); while (it != l.end()) { l.erase(it++); }}

l.erase(it++);

也可以写作

it = l.erase(it); //erase的返回值是删除位置下一个位置的迭代器

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。