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

相关推荐
码农老李22 分钟前
openEuler2403服务器版 原生官方镜像和飞腾定制镜像
开发语言·php
落羽的落羽42 分钟前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划
goodesocket42 分钟前
芯片HAST测试:通电工作下如何精准模拟极端环境挑战?
c++
charlie1145141911 小时前
现代Qt开发教程(新手篇)2.3——QImage、QPixmap、QIcon 图像处理基础
开发语言·图像处理·qt
范范@1 小时前
python基础-函数
开发语言·python
特种加菲猫1 小时前
从零开始手撕AVL树:详解插入、平衡因子更新与四种旋转
开发语言·c++
萑澈1 小时前
算法竞赛入门:C++ STL核心用法与时空复杂度速查手册
数据结构·c++·算法·stl
roman_日积跬步-终至千里2 小时前
如何分析复杂架构:一套真正能落地的方法
java·开发语言·架构
geovindu2 小时前
go: Semaphore Pattern
开发语言·后端·设计模式·golang·企业级信号量模式