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

相关推荐
爱吃香菜的初学者6 小时前
十四.Linux——消息队列
linux·运维·开发语言
迅猛龙办公室6 小时前
python实现倒序输出数字
开发语言·python
h397410 小时前
DirectShow过滤器开发-视频源过滤器
c++·windows·音视频·directshow
夏幻灵12 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码12 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
西飘客13 小时前
vs 怎么根据dll 生成lib文件
c++·qt
bkspiderx13 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆14 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光14 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
信奥卷王14 小时前
[GESP202609 六级] 分树规划
算法