list的介绍

list的底层是双向循环列表,每个节点包含:

数据域:存储元素值。

前驱指针(prev):指向前一个节点。

后继指针(next):指向后一个节点

特点:

节点在内存中不连续,通过指针链接

任意位置插入 / 删除只需修改指针(时间复杂度 O(1))

list的构造与初始化

cpp 复制代码
#include<list>
#include<iostream>
void test()
{
  list<int> l1;//构造无参空list
  list<int> l2(5,10);
  //用迭代器范围初始化(拷贝其他容器元素)
  list<int> l3(v.begin(),v.end());
  list<int> l4<l3>;
}
  

list iterator的使用

begin+end

begin指向第一个元素的迭代器,end指向最后一个位置的下一个位置的迭代器,作为迭代的结束标志。

cpp 复制代码
for(list<int>::iterator it=l.begin;it!=end();it++)
{
   *it*=2;
 }

rbegin+rend

rebegin指向最后一个元素的反向迭代器,rend指向第一个元素的前一个位置的反向迭代器。

cpp 复制代码
for (list<int>::reverse_iterator rit = l.rbegin(); rit != l.rend(); ++rit) 
    {
        cout << *rit << " ";
    }

list capacity

empty

检测list是否为空,如果为空,返回true,否则返回false。

size

返回list当中有效节点的个数

cpp 复制代码
cout<<l.size()<<endl;

list element access

front

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

back

功能:返回 list 的最后一个节点中值的引用。

cpp 复制代码
cout<<l.front()<<endl;
cout<<l.back()<<endl;

list modifiers

push_front

在list首元素前插入值为val的元素

cpp 复制代码
l.push_front(1);

pop_front

在list首元素前删除值

cpp 复制代码
l.pop_front(1);

push_back

在 list 尾部插入值为 val 的元素

pop_back

在list尾部插入值为val的元素

insert

在list的目标位置插入值为val的元素

cpp 复制代码
l.insert(it,3);

erase

在list中删除值为val的元素

cpp 复制代码
auto it=l.begin();
++it;
++it;
l.erase(it);

swap

交换两个list的元素

cpp 复制代码
l1.swap(l2);

clear

清除list当中的有效元素

cpp 复制代码
l.clear();

list的迭代器失效

list是双向循环列表,节点在内存当中不连续。因此:

1插入操作不会导致迭代器失效

2删除操作仅被删除的节点的迭代器删除,其他节点迭代器不受影响

错误的示例:

cpp 复制代码
void test()
{
  int array[]={1,2,3,4};
  list<int> l(array,array+sizeof(array)/sizeof(array[0]);
  auto it=l.begin();
  while(it!=l.end())
  {
     l.erase(it);
     ++it;//对失效的迭代器自增,是未定义行为
   }
}

正确代码:

cpp 复制代码
l.erase(it++);//

原因:

it是用后自增,会先返回it的当前值,用于删除erase当前值,然后自动移动到下一个节点,避免使用失效的迭代器。

也可以显式使用erase的返回值更新:

cpp 复制代码
it=l.erase(it);

list的反向迭代器

反向迭代器的核心设计就是内部有一个正向迭代器_it。通过对正向迭代器的操作进行反转:

反向迭代器的++相当于反向迭代器的--;

反向迭代器的--相当于正向的++;

反向迭代器解引用时*访问的是正向迭代器前一个位置的元素。

相关推荐
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠3 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦10 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠11 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾11 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82111 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q11 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒11 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
世人万千丶11 天前
成语接龙小应用 - HarmonyOS ArkUI 开发实战-TextInput与List列表-PC版本
华为·list·harmonyos·鸿蒙·鸿蒙系统
WL学习笔记11 天前
单项不带头不循环链表
数据结构·链表