C++的vector、list、map和unordered_map用法及解读

 更新时间:2026年07月01日 16:45:03   作者:2080.  
这段描述概括了vector、list和map三种容器的特点与适用场景,vector适合随机访问和动态操作,list适合两端插入删除,而map则适用于一对一映射关系的高效查找

vector

是向量类型,可以容纳许多类型的数据,因此也被称为容器。

相当于一个数组,在内存中分配一块连续的内存空间进行存储,可以不指定vector的大小。

STL内部实现时,首先分配一个非常大的内存空间预备进行存储,若超过此分配的空间时再整体重新分配一块内存存储。

(头文件#include)

//定义长度为10整型元素的向量
vector<int> a(10);
//10个初始化为1的向量
vector<int> a(10,1);
//用向量b给向量a赋值,a的值完全等价于b的值
vector<int> a(b);
//将向量b的开始位置,长度为3的元素赋值给a
vector<int> a(b.begin(),b.begin+3);
//使用数组赋值
int b[7]={1,2,3,4,5,6,7}
vector<int> a(b,b+7);
//添加元素
vector<int> a;
a.push_back(0);//添加元素
//从现有向量中选择性添加
int a[6]={1,2,3,4,5,6};
vector<int>b;
vector<int>c(a,a+4);
for(vector<int>::iterator it=c.begin();it<c.end();++it)
{
	b.push_back(*it);
}
//从向量中读取元素
int a[6]={1,2,3,4,5,6};
vector<int>b(a,a+4);
for(int i=0;i<=b.size()-1;++i){cout<<b[i]<<endl;}

优点

  • 不指定内存大小的数组,可以像数组那样操作,也可以对数组进行动态操作,通常体现在push_back()(添加元素)和pop_back()(移除元素)
  • 随机访问方便,可以[]和vector.at()
  • 节省空间

缺点

  • 在内部执行插入或删除操作效率低
  • push和pop只能在vector尾部操作
  • 当添加数据超过vector默认分配的大小时,要进行整体的重新分配、拷贝和释放

list

是STL实现的双向链表,每个节点都包含信息块info、前驱指针Pre和后驱指针Post。

可以不用指定内存大小,使用不连续的内存空间进行存储

(头文件#include)

//初始化
list<int> list1; //创建空list
list<int> list2(5);//创建长度为5的list
list<int> list3(3,2);//长度为3,初始化为2的list
list<int> list4(list2);//使用list2初始化
list<int> list5(list2.begin(),list2.end());
//常用函数
 list2.assign(8,1);//赋值
 list2.back();//返回最后一个元素
list2.begin();//返回指向第一个元素的迭代器
list2.front();//返回第一个元素
list2.pop_back();//删除最后一个元素 
list2.pop_front();//删除第一个元素 
list2.push_back();//在list的末尾添加一个元素 
list2.push_front();//在list的头部添加一个元素 

优点

  • 不使用连续内存完成动态操作。
  • 进行插入和删除操作方便
  • 可以在两端进行push、pop

缺点

  • 不能通过下标随机访问
  • 不连续存储,占用内存多

map

是STL的一个关联容器,包含“关键字/值”对,提供一对一的hash。

map以模板(泛型)方式实现,可以存储任意类型的数据,包括自定义的数据类型。

map主要用于资料一对一映射的情况,map内部的实现自建一颗红黑树,这棵树具有对数据自动排序的功能。

(头文件#include)

//插入元素
map<int,string> Map;
Map.insert(pair<int,string>(1,"first"));
Map.insert(map<int,string>::value_type(2,"value"));//插入value_type数据
//查找元素
it=Map.find("first");
if(it!=Map.end())
    cout<<it->second; //返回数据的位置
else
    cout<<"没找到";
//删除和清空元素
Map.erase("first");//删除返回1,否则返回0
Map.erase(Map.begin(),Map.end());//使用迭代器清空整个map
Map.clear();//清空Map
//map大小
Map.size();

优点

  • 有序性,简化操作
  • map的查找、删除、增加等操作时间复杂度稳定-logn

缺点

  • 查找、删除等操作比较慢
  • 空间占有率高

unordered_map

无序映射关联容器,基于hash表实现

//声明,初始化
unordered_map<string,int> UnMap;
unordered_map<string,int> Map={{"1",1},{"2",2}}
//插入操作
UnMap.insert(Map);/复制插入
UnMap.insert(make_pair<string,int>("3",3)); //移动插入
UnMap.insert(Map.begin(),Map.end()); //范围插入
UnMap["4"]=4; //数组形式插入
//查找操作
unordered_map<string,int>::const_iterator it=UnMap.find("1");
if(it!=UnMap.end())
    cout<<it->first;
else 
    cout<<"没有找到";
//修改操作
UnMap["2"]=5;
UnMap.at("1")=6;
//清除操作
UnMap.erase(UnMap.begin()); //通过位置清空元素
UnMap.erase("2"); //通过键值清除元素
UnMap.clear(); //清空操作

优点

  • 查找速度快

缺点

  • 哈希表的建立比较耗费时间

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Linux环境下并发编程中C语言fork()函数的使用

    浅谈Linux环境下并发编程中C语言fork()函数的使用

    fork函数在Linux中可以创建子进程即一个新的进程,这里我们根据实例来浅谈Linux环境下并发编程中C语言fork()函数的使用,需要的朋友可以参考下
    2016-06-06
  • 去掉vs2010中ipch文件和.sdf文件的解决方法

    去掉vs2010中ipch文件和.sdf文件的解决方法

    本篇文章介绍了,在vs2010中产生的ipch文件和.sdf文件的解决方法。需要的朋友参考下
    2013-05-05
  • C 语言进制之间的转换

    C 语言进制之间的转换

    本篇文章主要介绍了C语言进制之间的转换,举例说明并附图片,帮助大家理解,希望对大家有所帮助
    2016-07-07
  • C++中发声函数Beep用法

    C++中发声函数Beep用法

    本文给大家分享的是Beep函数的用法以及会使扬声器发出简单的声音的示例,有需要的小伙伴可以参考下
    2017-05-05
  • C++ OpenCV实战之图像全景拼接

    C++ OpenCV实战之图像全景拼接

    本文主要介绍了如何使用OpenCV C++ 进行图像全景拼接,文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,感兴趣的可以了解一下
    2022-01-01
  • c语言中scanf的基本用法

    c语言中scanf的基本用法

    这篇文章主要给大家介绍了关于c语言中scanf的基本用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C语言每日练习之冒泡排序

    C语言每日练习之冒泡排序

    这篇文章主要介绍了C语言冒泡排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • 浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr

    浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr

    虽然通过弱引用指针可以有效的解除循环引用,但这种方式必须在程序员能预见会出现循环引用的情况下才能使用,也可以是说这个仅仅是一种编译期的解决方案,如果程序在运行过程中出现了循环引用,还是会造成内存泄漏的
    2013-09-09
  • Qt Qml实现毛玻璃效果

    Qt Qml实现毛玻璃效果

    毛玻璃效果是一种常见的 UI 设计风格,它通过模糊背景并添加透明度和噪声效果,使界面元素看起来像是半透明的磨砂玻璃,下面我们来看看如何使用Qml实现毛玻璃效果吧
    2025-01-01
  • C++访问Redis的mset 二进制数据接口封装方案

    C++访问Redis的mset 二进制数据接口封装方案

    这篇文章主要介绍了C++访问Redis的mset 二进制数据接口封装方案的相关资料,需要的朋友可以参考下
    2015-07-07

最新评论