C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++ vector、list、map和unordered_map

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

作者: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;}

优点

缺点

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的头部添加一个元素 

优点

缺点

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();

优点

缺点

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(); //清空操作

优点

缺点

总结

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

您可能感兴趣的文章:
阅读全文