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中非常重要的序列式容器,由于两个容器的底层结构不同,导致其特性以及 应用场景不同,其主要不同如下:

相关推荐
第九序言T36 分钟前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
m0_6399069437 分钟前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
Sakura_j_h_1 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
ZhengEnCi2 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
龙亘川2 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人2 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David2 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1003 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
Pniubi3 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6183 小时前
大模型落地三重优化实战
人工智能·算法·机器学习