list的介绍

  1. list是序列容器,允许在序列中的任何位置执行固定O(1)时间复杂度的插入和删除操作,并在两个方向进行迭代。
  2. list容器使用双链表实现;双链表将每个元素存储在不同的位置,每个节点通过next,prev指针链接成顺序表。
  3. list与其他标准序列容器(array,vector和deque)相比,list通常可以在容器内的任何位置插入、提取和移动元素。
  4. list与其他标准序列容器(array,vector和deque)相比,list和forward_list(单链表实现)的主要缺点是他们不能通过位置直接访问元素;例如,要访问列表中的第五个元素,必须从已知位置(开始或结束)迭代到该位置,需要哦线性时间开销。
  5. 存储密度低,list要使用一些额外的内容空间(next,prev)来保持与每个元素相关联(前后续的线性)的链接信息,从而导致存储小元素类型(如char,short,int等)的列表的存储密度低。

list函数说明

成员类型

成员类型 定义
value_type T
allocator_type Allocator
size_type 无符号整数类型(通常是 std::size_t )
difference_type 有符号整数类型(通常是 std::ptrdiff_t )
reference value_type&
const_reference const value_type&
pointer value_type*
const_pointer const value_type*
iterator 指向 value_type 的双向迭代器
const_iterator 指向 const value_type 的双向迭代器
reverse_iterator std::reverse_iterator
const_reverse_iterator std::reverse_iterator<const_iterator>

构造函数

函数 功能
list(); 默认构造函数。构造拥有默认构造的分配器的空容器
list( size_type count,const T& value); 构造拥有 count 个有值 value 的元素的容器。
explicit list( size_type count ); 构造拥有个 count 默认插入的 T 实例的容器。
list( InputIt first, InputIt last, const Allocator& alloc = Allocator() ); 构造拥有范围 [first, last) 内容的容器。
list( const list& other ); 复制构造函数。构造拥有 other 内容的容器。
list& operator=( const list& other ); 复制赋值运算符。以 other 的副本替换内容。
list& operator=( std::initializer_list ilist ); 以 initializer_list ilist 所标识者替换内容。
void assign( size_type count, const T& value ); 以 count 份 value 的副本替换内容。
template< class InputIt >
void assign( InputIt first, InputIt last ); 以范围 [first, last) 中元素的副本替换内容。
void assign( std::initializer_list ilist ); 以来自 initializer_list ilist 的元素替换内容
#include <iostream>
#include <list>using namespace std;template<class T>
void Print(const list<T>& my)
{typename list<T>::const_iterator it = my.begin();for (; it != my.end(); it++){cout << *it << "\t";}cout << endl;
}int main()
{list<int> list1 = { 12,23,34 };list<int> list2(3, 11);list<int> list3(list2);list<string> list4 = { "This","is","windows" };list<string> list5;list<string> list6;list5 = list4;list6.assign(3, "This");Print(list1);Print(list2);Print(list3);Print(list4);Print(list5);Print(list6);return 0;
}

元素访问

元素访问 功能
reference front(); 返回到容器首元素的引用。
const_reference front() const; 返回到容器首元素的引用。
reference back(); 返回到容器中最后一个元素的引用。
const_reference back() const; 返回到容器中最后一个元素的引用。
#include <iostream>
#include <list>using namespace std;int main()
{list<int> list1 = { 12,23,34 };cout << "list1.front():" << list1.front() << endl;cout << "list1.back():" << list1.back() << endl;return 0;
}

迭代器

迭代器 功能
iterator begin(); 返回指向 list 首元素的迭代器。
若 list 为空,则返回的迭代器将等于 end() 。
const_iterator begin() const; 返回指向 list 首元素的迭代器。
若 list 为空,则返回的迭代器将等于 end() 。
iterator end(); 返回指向 list 末元素后一元素的迭代器。
const_iterator end() const; 返回指向 list 末元素后一元素的迭代器。
reverse_iterator rbegin(); 返回指向逆向 list 首元素的逆向迭代器。
const_reverse_iterator rbegin() const; 返回指向逆向 list 首元素的逆向迭代器。
reverse_iterator rend(); 返回指向逆向 list 末元素后一元素的逆向迭代器。
const_reverse_iterator rend() const; 返回指向逆向 list 末元素后一元素的逆向迭代器。

#include <iostream>
#include <list>using namespace std;int main()
{list<int> list1 = { 12,23,34 };list<int>::const_iterator it1 = list1.begin();for (; it1 != list1.end(); it1++){cout << *it1 << "\t";}cout << endl;list<int>::reverse_iterator it2 = list1.rbegin() ;for (; it2 != list1.rend(); it2++){cout << *it2 << "\t";}cout << endl;return 0;
}

容量

容量 功能
bool empty() const; 检查容器是否无元素,即是否 begin() == end() 。
size_type size() const; 返回容器中的元素数,即 std::distance(begin(), end()) 。
size_type max_size() const; 返回根据系统或库实现限制的容器可保有的元素最大数量,即对于最大容器的 std::distance(begin(), end()) 。
#include <iostream>
#include <list>using namespace std;int main()
{list<int> list1 = { 12,23,34 };cout << "list1.empty():" << list1.empty() << endl;cout << "list1.size():" << list1.size() << endl;cout << "list1.max_size():" << list1.max_size() << endl;return 0;
}

修改器

修改器 功能
void clear(); 从容器擦除所有元素。此调用后 size() 返回零。
iterator insert( iterator pos, const T& value ); 在 pos 前插入 value 。
void insert( iterator pos, size_type count, const T& value ); 在 pos 前插入 value 的 count 个副本。
template< class InputIt >
void insert( iterator pos, InputIt first, InputIt last); 在 pos 前插入来自范围 [first, last) 的元素
iterator insert( const_iterator pos, std::initializer_list ilist ); 在 pos 前插入来自 initializer_list ilist 的元素
iterator erase( iterator pos ); 移除位于 pos 的元素。
iterator erase( iterator first, iterator last ); 移除范围 [first; last) 中的元素。
void pop_back(); 移除容器的末元素。
void push_front( const T& value ); 前附给定元素 value 到容器起始。
void push_back( const T& value ); 后附给定元素 value 到容器尾。
void pop_front(); 移除容器首元素。
void resize( size_type count ); 重设容器大小以容纳 count 个元素。
void resize( size_type count, T value = T() ); count - 容器的大小,value - 用以初始化新元素的值
void swap( list& other ); 将内容与 other 的交换。
#include <iostream>
#include <list>using namespace std;template<class T>
void Print(const list<T>& my)
{typename list<T>::const_iterator it = my.begin();for (; it != my.end(); it++){cout << *it << "\t";}cout << endl;
}int main()
{list<int> list1 = { 12,23,34 };list<int> list2 = { 1,2,3,4,5 };Print(list1);Print(list2);auto it = list1.begin();list1.insert(it, 55);Print(list1);it++;list1.insert(it, 3, 55);Print(list1);list1.erase(it);Print(list1);list1.swap(list2);Print(list1);Print(list2);return 0;
}

操作

操作 功能
void merge( list& other ); 归并二个已排序链表为一个。链表应以升序排序。
void splice( const_iterator pos, list& other ); 从 other 转移所有元素到 *this 中。元素被插入到 pos 所指向的元素之前。操作后容器 other 变为空。
void splice( const_iterator pos, list& other, const_iterator it ); 从 other 转移 it 所指向的元素到 *this 。元素被插入到 pos 所指向的元素之前。
void splice( const_iterator pos, list& other, const_iterator first, const_iterator last); 从 other 转移范围 [first, last) 中的元素到 *this 。元素被插入到 pos 所指向的元素之前。
void remove( const T& value ); 移除所有满足特定标准的元素。value - 要移除的元素的值
void reverse(); 逆转容器中的元素顺序。
void unique(); 从容器移除所有相继的重复元素。只留下相等元素组中的第一个元素。
void sort(); 以升序排序元素。保持相等元素的顺序。用 operator< 比较元素
template< class Compare >
void sort( Compare comp ); 以升序排序元素。保持相等元素的顺序。用给定的比较函数 comp 。
#include <iostream>
#include <list>using namespace std;template<class T>
void Print(const list<T>& my)
{typename list<T>::const_iterator it = my.begin();for (; it != my.end(); it++){cout << *it << "\t";}cout << endl;
}int main()
{list<int> list1 = { 2,1,9,5,3,7 };list<int> list2 = { 1,8,3,6,0,1,5 };Print(list1);Print(list2);list1.sort();list2.sort();Print(list1);Print(list2);list2.unique();Print(list2);list1.merge(list2);Print(list1);Print(list2);return 0;
}

vector和list区别

区别 vector list
底层实现 连续存储的容器,动态数组,在堆上分配空间 动态双向链表,在堆上
空间利用率 连续空间,不易造成内存碎片,空间利用率高 节点不连续,易造成内存碎片,小元素使节点密度低,空间利用率低
查询元素 iterator operator[];find O(n);binary_search O(logn) iterator find O(n)
插入和删除 在最后插入(空间够):push_back(val);O(1)。在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。在之间插入(空间够):内存拷贝。在之间插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。Insert(it,va) ,O(n)。在最后删除:pop_back(),O(1)。在之间删除:内存拷贝,不需要释放内存。erase(it),O(n)。resize(10):开辟空间,存储数据。reserve(10):只开辟空间,不存储数据。初始化vector空间,提高vector的使用效率。 插入:O(1),需要申请内存。push_back(),O(1);erase(it) ,O(n);
迭代器 随机迭代器,迭代器检查越界。支持++,–,+,+=,<,>,!=,== 双向迭代器,迭代器检查越界。支持++,–,==,!=
迭代器失效 插入和删除元素都会导致迭代器失效 插入元素

总结

  1. vector底层实现是驻足;list是双向链表。
  2. vector支持随机访问,list不支持。
  3. vector是顺序内存,list不是。
  4. vector在中间节点进行插入删除会导致内存拷贝,list不会。
  5. vector一次性分配好内存,不够时才进行扩容;list每次插入新节点都会进行内存申请。
  6. vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。

vector和list的使用场景

  1. 如果需要高效的随机存取,而不在乎插入和删除的效率(很少使用插入和删除操作),选用vector
  2. 如果需要大量的插入和删除的操作,随机存取很少使用,选用list。

仿写

见下篇

END!在这里插入代码片

C++中list详解相关推荐

  1. 函数中{}输出格式详解(C#)

    Console.WriteLine()函数中{}输出格式详解(C#) Console.WriteLine()函数的格式一直没怎么注意.今天同事问起Console.WriteLine({0:D3},a) ...

  2. Java中CAS详解

    转载自  Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...

  3. 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

    转自:图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 ...

  4. oracle itl解析,oracle数据块dump文件中ITL详解

    oracle数据块dump文件中ITL详解 dump出Oracle block后,可以看到事物槽,包含有事物槽号(ITL),XID,UBA,FLAG,LCK,SCN. 本文主要讨论FLAG标记的规则, ...

  5. android中getSystemService详解

    原文地址:android中getSystemService详解作者:邹斌 http://blog.sina.com.cn/s/blog_71d1e4fc0100o8qr.html http://blo ...

  6. Oracle中CONCAT详解

    Oracle中CONCAT详解 1.什么是CONCAT 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写 ...

  7. Java中LinkedList详解

    Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...

  8. vue 生命周期的11中方法详解

    vue 生命周期的十一中方法详解 vue 生命周期的定义 vue实例 从创建到销毁,也就是说从创建 -> 初始化 数据-> 编译模版 -> 挂载Dom -> 渲染 更新 -&g ...

  9. oracle语句中dual什么意思,oracle中dual详解

    oracle中dual详解 基本上oracle引入dual为的就是符合语法 1. 我们先从名称来说,dual不是缩写词,本身就是完整的单词.dual名词意思是对数,做形容词时是指二重的,二元的. 2. ...

  10. 24.shell中list详解,定义list,获取List的总个数,获取list的某个元素值,将list的每个元素转换成以空格分隔的字符串,空格分隔的字符串转换成list,for循环list

    文章目录 前言 定义list 获取List的总个数 获取list的某个元素值 将list的每个元素转换成以空格分隔的字符串 空格分隔的字符串转换成list for循环list 总结 友情链接 前言 s ...

最新文章

  1. 机器人 Ameca「苏醒」瞬间逼真到令人恐惧,网友纷纷惊叹……
  2. unity值得推荐的网址
  3. 计算机创新课,计算机教学课程模式与创新论文
  4. C++查看数据存储大小端模式
  5. markdown与latex:如何写出像数学书里的大于等于\geqslant和小于等于\leqslant
  6. Java Lambda 策略模式
  7. Godaddy上的域名如何取消自动续费?
  8. 分享几个好用的导航导航网站
  9. 记一次IOS打包报错
  10. 周庄王,姬佗(公元前696年—公元前682年在位)
  11. C/S 和 B/S 模式的区别与联系
  12. TOMCAT8配置(已配置好环境变量,端口为8080),但localhost:8080/显示404错误
  13. 写论文CAJ如何提取文字?
  14. 可解释推荐系统研究综述
  15. 按照 STAR 法则介绍自己做过的项目
  16. 2022年中级网络工程师备考(非网络知识部分)
  17. java.lang.IllegalStateException: Web app root system property already set to different value: 'webap
  18. 个人投资课 张潇雨_张潇雨·个人投资课笔记
  19. 8月收到的最新更新附近的人交友系统源码,自动打招呼,自动发视频通话+自动聊天多功能机器人交友源码
  20. 最佳光圈值 (Optimum Aperture)

热门文章

  1. [PTA]习题7-3 判断上三角矩阵
  2. 使用ContentObserver实现短信提醒功能
  3. 让前端飞:形象理解 Hbuilder、文本标记、超链接、列表、图片、表格
  4. thinkpad 安装XP全过程
  5. 快速将纸质文件变为电子稿件
  6. slmgr.vbs /rearm
  7. python机器学习之基于内容的推荐算法中推荐麻辣香锅菜品实战(附源码)
  8. 自定义表单input属性 检查必填
  9. Cisco 交换机3650密码破解
  10. 掌握hiberate核心就够了