探索C++的工具箱:双向链表容器类list(1)

引言

        在C++中,std::list 是一个标准库提供的容器类,属于C++ STL(标准模板库)。std::list 是一种独特而强大的容器,它使用双向链表结构来管理元素。无论是在处理动态数据集合,还是在需要频繁进行插入和删除操作时,std::list 都展现了无与伦比的灵活性和效率。与其他线性数据结构如数组和向量相比,std::list 让开发者能够在不影响整体性能的情况下,轻松地在数据集中间添加或移除元素。

在这篇博客中,会以介绍与string类和vector类中相通的函数为主,在下一篇博客,探索C++的工具箱:双向链表容器类list(2)-优快云博客中,会以介绍string类 和vector类中没有的、list新引入的内容为主

1. list 简介

C++ 的 std::list 是一个双向链表(doubly linked list)的实现,与 vector 不同,list 提供 O(1) 的插入和删除操作,但不支持随机访问。使用时需要包含头文件<list>。

        如果将“list”比喻为一个“购物清单”,而“list中的元素”就相当于“购物清单上的每一项商品”。

在这个比喻中:

- 整个购物清单(list)是一个容器,帮助我们整理和管理购物的内容。

- 每一项商品(list中的元素)则是清单中具体要购买的内容。

就像我们可以在购物清单上添加、删除或修改商品,列表中的元素也可以随时增删改。

std::list具有以下特点:

  1. 双向链表:std::list 中的每个元素都包含指向前一个元素和后一个元素的指针。这使得在链表的任意位置进行插入和删除操作非常快速(时间复杂度为O(1)),但访问随机元素的效率较低(时间复杂度为O(n))。

  2. 动态大小:std::list 可以根据需要动态增长或收缩,能够有效管理动态变化的数据集。

  3. 不连续存储:与std::vector 不同,std::list 中的元素在内存中不必连续存储,这为插入和删除操作防止内存重排提供了便利。

  4. 支持迭代器:std::list 支持常规和反向迭代器,可以方便地遍历链表元素。

2.list的构造

基本语法:


default (1)	
explicit list (const allocator_type& alloc = allocator_type());
fill (2)	
explicit list (size_type n);
         list (size_type n, const value_type& val,
                const allocator_type& alloc = allocator_type());
range (3)	
template <class InputIterator>
  list (InputIterator first, InputIterator last,
         const allocator_type& alloc = allocator_type());
copy (4)	
list (const list& x);
list (const list& x, const allocator_type& alloc);

move (5)	
list (list&& x);
list (list&& x, const allocator_type& alloc);

initializer list (6)	
list (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());

explicit 关键字用于构造函数,目的是为了防止类型转换(隐式转换)。如果一个构造函数被声明为 explicit,那么它只能通过显式的方式来调用,而不能用作隐式类型转换。 

以下是构造和使用 std::list 的几种常见方法(默认使用std):

(1)默认构造函数
创建一个空的 std::list,可以使用以下代码:


                
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值