【C++之STL】010序列容器篇list的优缺点以及构造和析构函数

介绍

C++的std::list容器是一个双向链表实现,它有一些独特的优点和缺点。下面我会列举一些主要的优点和缺点。
优点:

  • 插入和删除的高效性:在std::list中的任何位置进行插入和删除操作都是常数时间复杂度O(1),这是因为它基于链表结构,不需要像数组或向量那样移动大量元素。

  • 动态大小:std::list可以动态地增长和缩小,不需要预先知道其大小。

  • 内存使用灵活:std::list通常比连续存储的容器(如std::vector)使用更多的内存,但它的内存使用更加灵活,因为它不需要连续的内存块。

  • 迭代器稳定性:std::list的迭代器在插入和删除操作时仍然有效,除非迭代器本身被删除。

  • 双向迭代:std::list的迭代器可以双向移动,这意味着你可以向前或向后遍历列表。

缺点:

  • 随机访问的低效性:访问std::list中的元素不如访问数组或向量中的元素快。std::list的随机访问时间复杂度是O(n),因为你需要从头或尾开始遍历列表来找到元素。

  • 空间效率较低:与连续存储的容器相比,std::list通常会使用更多的内存,因为它需要存储额外的指针来维护链表结构。

  • 不连续存储:由于std::list是基于链表的,它的元素不是连续存储的。这可能会导致缓存不友好,因为访问相邻的元素可能会跨越很大的内存区域。

  • 不支持随机访问迭代器:std::list的迭代器不支持使用+或-运算符进行随机访问,只能逐个移动。

  • 可能产生内存碎片:频繁地在std::list中插入和删除元素可能会导致内存碎片。

根据具体的使用场景,std::list的优点和缺点可能会有所不同。例如,如果你需要频繁地在列表中间插入和删除元素,std::list可能是一个很好的选择。但如果你需要频繁地访问列表中的元素,并且关心内存使用效率,那么std::vector或std::deque可能更合适。

C++中的std::list容器有多个构造函数,允许你以不同的方式初始化列表。以下是std::list的一些常见构造函数及其用法示例:

默认构造函数

创建一个空的list容器。

std::list<int> myList;

拷贝构造函数

用另一个list容器来初始化一个新的list容器。

std::list<int> firstList = {1, 2, 3, 4, 5};
std::list<int> secondList(firstList); // 拷贝构造

赋值构造函数

通过赋值运算符从一个list容器创建另一个list容器。

std::list<int> firstList = {1, 2, 3, 4, 5};
std::list<int> secondList = firstList; // 赋值构造

初始化列表构造函数

使用初始化列表来初始化list容器。

std::list<int> myList = {10, 20, 30, 40, 50};

迭代器范围构造函数

使用两个迭代器(指向容器或其他序列的起始和结束位置)来初始化list容器。

std::vector<int> vec = {1, 2, 3, 4, 5};
std::list<int> myList(vec.begin(), vec.end());

大小和值构造函数

使用指定的大小和值来初始化list容器。

std::list<int> myList(10, 2); // 创建一个包含10个元素,每个元素值为2的list

移动构造函数

从另一个list容器移动元素来初始化新的list容器(C++11开始支持)。

std::list<int> firstList = {1, 2, 3, 4, 5};
std::list<int> secondList(std::move(firstList)); // 移动构造

列表初始化构造函数

使用C++11的列表初始化语法来初始化list容器。

std::list<int> myList = {1, 2, 3};

请注意,上述示例中的std::list可以替换为任何你想要的类型,例如std::liststd::string或std::list<std::pair<int, int>>等。

选择哪个构造函数取决于你的具体需求,例如,如果你已经有一个其他类型的容器并且想要创建一个与之内容相同的list,那么拷贝构造函数或初始化列表范围构造函数可能是最合适的。如果你只是想创建一个具有特定大小和默认值的空列表,那么大小和值构造函数可能更有用。

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫Devin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值