博客
关于我
【4】STL容器之 list vector deque map set 容器的异同点
阅读量:167 次
发布时间:2019-02-28

本文共 1732 字,大约阅读时间需要 5 分钟。

list容器的特点

list是一种序列式容器,其实现方式类似于双向链表。list的每个节点包含三个域:前驱指针、数据域和后继指针。由于其基于链表结构,list的插入和删除操作可以在任意位置高效完成。然而,list不支持随机存取操作,迭代访问必须通过“++”或“--”操作完成。此外,list的内存空间是不连续的,整体效率在插入和删除方面优于vector,但在随机存取方面则不如deque。

list vs vector vs deque的比较

vector

vector类似于内置的数组,具有连续内存空间,支持高效的随机存取操作(通过[]操作符)。然而,vector的插入和删除操作在中间位置会导致内存拷贝,影响其效率。尽管如此,vector因其高效的随机存取性能,仍是最常用的容器之一。

list

list基于双向链表结构,内存空间不连续,通过指针连接节点。list支持在任意位置插入和删除,但由于其链表特性,随机存取效率低,且没有[]操作符。list的优点在于插入和删除效率高,适合频繁操作数据的场景。

deque

deque是双端队列,支持在两端进行插入和删除,同时也支持随机存取操作。deque的实现结合了vector和list的优点,既能高效进行随机存取,又能在两端进行快速操作。

如何选择容器

选择list、vector或deque应根据具体需求:

  • 如果需要高效的随机存取且对插入删除操作不敏感,选择vector。
  • 如果需要频繁插入删除操作,选择list。
  • 如果需要两端操作且需要随机存取,选择deque。
  • list的具体使用方法

    构造函数

    • list<int> c0; 创建空链表。
    • list<int> c1(3); 创建长度为3的链表,元素初始化为0。
    • list<int> c2(5, 2); 创建长度为5的链表,元素为2。
    • list<int> c4(c2); 创建c2的副本。
    • list<int> c5(c1.begin(), c1.end()); 创建包含c1所有元素的链表副本。

    成员函数

    • c.begin() 返回指向链表第一个元素的迭代器。
    • c.end() 返回指向链表最后一个元素的迭代器。
    • c.front() 返回第一个元素。
    • c.back() 返回最后一个元素。
    • push_back() 从末尾插入元素。
    • push_front() 从开头插入元素。
    • pop_back() 删除最后一个元素。
    • pop_front() 删除第一个元素。
    • erase() 删除单个或多个元素(有重载)。
    • empty() 判断链表是否为空。
    • resize(n) 调整链表长度为n,超出部分删除。
    • clear() 清空链表。
    • swap() 交换两个链表。
    • merge() 合并两个链表并排序。

    迭代器访问

    #include 
    #include
    #include
    int main() { std::vector
    myvector; for (size_t i = 0; i < 5; ++i) { myvector.push_back(i); } // 正向迭代 auto ibegin = myvector.begin(); auto iend = myvector.end(); for (ibegin; ibegin != iend; ++ibegin) { std::cout << *ibegin << std::endl; } // 反向迭代 auto rbegin = myvector.rbegin(); auto rend = myvector.rend(); for (rbegin; rbegin != rend; ++rbegin) { std::cout << *rbegin << std::endl; } return 0;}

    上述代码展示了如何使用迭代器对vector进行正向和反向遍历。

    转载地址:http://inxc.baihongyu.com/

    你可能感兴趣的文章
    OpenCV保证输入图像为三通道
    查看>>
    OpenCV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    opencv图像分割2-GMM
    查看>>
    opencv图像分割3-分水岭方法
    查看>>
    opencv图像切割1-KMeans方法
    查看>>
    OpenCV图像处理篇之阈值操作函数
    查看>>
    opencv图像特征融合-seamlessClone
    查看>>
    OpenCV图像的深浅拷贝
    查看>>
    OpenCV在Google Colboratory中不起作用
    查看>>
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
    查看>>
    OpenCV学堂 | OpenCV中支持的人脸检测方法整理与汇总
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV学堂 | YOLOv8与YOLO11自定义数据集迁移学习效果对比
    查看>>
    OpenCV学堂 | YOLOv8官方团队宣布YOLOv11 发布了
    查看>>
    OpenCV学堂 | YOLOv8实战 | 荧光显微镜细胞图像检测
    查看>>
    OpenCV学堂 | 汇总 | 深度学习图像去模糊技术与模型
    查看>>
    OpenCV安装
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>