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(); //清空操作
优点:
- 查找速度快
缺点:
- 哈希表的建立比较耗费时间