c++---list介绍

先点赞后观看哦!!!谢谢大家

1.list的介绍及使用

http://www.cplusplus.com/reference/list/list/?kw=list

1.2 list的使用

ist 中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已
达到可扩展的能力。以下为 list 中一些 常见的重要接口

1.2.1 list的构造

1.2.2 list iterator的使用

此处,大家可暂时 将迭代器理解成一个指针,该指针指向 list 中的某个节点


【注意】

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

1.2.3 list capacity

1.2.4 list element access

1.2.5list modifilers


list 中还有一些操作,需要用到时大家可参阅 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.list的模拟实现

2.1模拟实现list

要模拟实现list,必须要熟悉list的底层结构以及其接口的含义,通过上面的学习,这些内容已基本 掌握,现在我们来模拟实现list。

https://gitee.com/zhejiang-daniel-wu/my_c_code/blob/master/text_10_23/text_10_23/list.h

2.2list的反向迭代器

通过前面例子知道,反向迭代器的 ++ 就是正向迭代器的 -- ,反向迭代器的 -- 就是正向迭代器的 ++ ,
因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对
正向迭代器的接口进行包装即可。
template < class Iterator >
class ReverseListIterator
{
// 注意:此处 typename 的作用是明确告诉编译器, Ref 是 Iterator 类中的类型,而不是静态
成员变量
// 否则编译器编译时就不知道 Ref 是 Iterator 中的类型还是静态成员变量
// 因为静态成员变量也是按照 类名 :: 静态成员变量名 的方式访问的
public :
typedef typename Iterator::Ref Ref ;
typedef typename Iterator::Ptr Ptr ;
typedef ReverseListIterator < Iterator > Self ;
public :
//////////////////////////////////////////////
// 构造
ReverseListIterator ( Iterator it ): _it ( it ){}
//////////////////////////////////////////////
// 具有指针类似行为
Ref operator * (){
Iterator temp ( _it );
-- temp ;
return * temp ;
}
Ptr operator -> (){ return & ( operator * ());}
//////////////////////////////////////////////
// 迭代器支持移动
Self & operator ++ (){
-- _it ;
return * this ;
}
Self operator ++ ( int ){
Self temp ( * this );
-- _it ;
return temp ;
}
Self & operator -- (){
++ _it ;
return * this ;
}
Self operator -- ( int )
{
Self temp ( * this );
++ _it ;
return temp ;
}
//////////////////////////////////////////////
// 迭代器支持比较
bool operator != ( const Self & l ) const { return _it != l . _it ;}
bool operator == ( const Self & l ) const { return _it != l . _it ;}
Iterator _it ;
};

3. list与vector的对比

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

相关推荐
程序喵大人2 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng2 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
wdfk_prog4 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕4 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫4 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通5 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
碎光拾影5 小时前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
GeekArch5 小时前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
AC赳赳老秦6 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw