C++的vector、list、map和unordered_map

C++的vector、list、map和unordered_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(); //清空操作
优点:
  • 查找速度快
缺点:
  • 哈希表的建立比较耗费时间
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值