C++中的vector和list的区别与适用场景

区别

特性 vector list
底层实现 动态数组 双向链表
内存分配 连续内存块 非连续内存块
随机访问 支持,通过索引访问,时间复杂度O(1) 不支持,需遍历,时间复杂度O(n)
插入/删除 末尾操作效率高,时间复杂度O(1) 任意位置操作效率高,时间复杂度O(1)
内存开销 较低 较高,需要额外存储指针
迭代器稳定性 插入/删除迭代器会失效 插入/删除迭代器不会失效

使用场景

使用vector的场景

1.需要频繁随机访问元素。

2.数据量较大且内存连续性有助于性能优化。

3.插入和删除操作主要集中在容器末尾。

使用list的场景

1.需要频繁在中间插入或者删除元素。

2.数据量较小,内存开销不是主要考虑因素。

3.不需要随机访问,仅需顺序遍历。

示例代码

vector的常用方法

  1. 初始化
cpp 复制代码
std::vector<int> vec ={1,2,3};
std::vector<int> vec2(10,0);//初始化大小为10,所有元素为0

2.添加元素

cpp 复制代码
vec.push_back(4);//在尾部添加元素
vec.insert(vec.begin()+1,10);//在指定位置插入一个或多个元素。
vec.emplace_back(5);//在末尾直接构造元素,避免不必要的拷贝
vec.emplace(vec.begin() + 1, 5, 6); // 指定位置直接构造元素,在索引 1 的位置直接构造 pair(5, 6)
vec.assign(3,7);//替换整个 vector 的内容,vec变为 {7,7,7}

3.删除元素

cpp 复制代码
vec.pop_back();//删除尾部元素
vec.erase(vec.begin()+1);//删除指定位置的元素

4.访问元素

cpp 复制代码
int vel=vec[0];//随机访问
int val2=vec.at(1);//带边界的访问

5.遍历

cpp 复制代码
for(int val:vec){
	std::cout << val << " ";
}

6.修改大小

cpp 复制代码
vec.resize(5)//调整大小为5

7.清空

cpp 复制代码
vec.clear();

list的用法

1.初始化

cpp 复制代码
std::list<int> lst={1,2,3};
std::list<int> lst2(10,0);//初始化大小为10,所有元素为0

2.添加元素

cpp 复制代码
lst.push_back(4);//在尾部添加元素
lst.push_front(0);//在开头添加元素
auto it = lst.begin();
std::advance(it,1);
lst.insert(it,5);//在指定位置插入元素

3.删除元素

cpp 复制代码
lst.pop_back();
lst.pop_front();//删除开头元素
lst.erase(lst.begin());//删除指定位置的元素

4.访问元素

cpp 复制代码
for(int val:lst){
	std::cout << val << " ";
}
  1. 修改大小
cpp 复制代码
lst.resize(5);//调整大小为5
  1. 清空
cpp 复制代码
lst.clear();

7.排序

cpp 复制代码
lst.sort();//对列表进行排序
  1. 合并
cpp 复制代码
std::list<int> lst2 = {4,5,6};
lst.merge(lst2);

9.反转

cpp 复制代码
lst.reverse();//反转列表

通过以上总结,可以根据具体需求选择使用vector或list

相关推荐
wo_jack3 小时前
C++ 入门笔记(十六):第16课 vector 模拟实现十问十答 —— 从三指针到迭代器失效
c++·后端·面试·stl·vector
D e re k ZH4 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶4 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing035 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
雪落漂泊5 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
波力海苔夹心脆6756 小时前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
不会算法的笨小孩6 小时前
异常的使用以及会出现的问题
开发语言·c++·c++11·异常
Hhy_11078 小时前
《C++深度解构06》手撕 string —— 从底层内存管理到深浅拷贝彻底吃透
c语言·开发语言·c++·学习·visual studio
starzy19908 小时前
深入理解Scala函数定义:从方法到函数的类型跨越
开发语言·scala
starzy19909 小时前
深入理解Scala递归函数:从栈溢出到尾调用优化
开发语言·scala