map的建立,插入,遍历,删除,以及map和unordered_map的区别
map的常规用法
1.map的建立
//1.建立
map<int,string> classroom = {{1,"秋刀鱼"},{2,"酱香鸡"}};
//前面的是键,后面是值,键唯一值不唯一
2.map的插入
//2.插入
classroom.insert(pair<int,string>(3,"隆江猪"));
//使用到pair
3.map的遍历
//3.遍历
auto iter = classroom.begin();//自动转型 "map<int,string> ::iterator"和"auto"一样
for(;iter!=classroom.end();){
cout << iter->first << iter->second << endl;
iter++;
}
4.map的查询
//4.查询
auto findIter = classroom.find(4);//end指代的是map的最后的后一个元素"空"
if(findIter!=classroom.end()){
cout << findIter->first << findIter->second<<endl;
}
5.map的删除
//5.删除(迭代器形式)
auto deleteIter = classroom.find(3);
classroom.erase(deleteIter);
//查看结果
iter = classroom.begin();//自动转型
for(;iter!=classroom.end();){
cout << iter->first << iter->second << endl;
iter++;
}
//5.删除的一般形式
classroom.erase(1);
6.整块代码
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main(void){
//1.建立
map<int,string> classroom = {{1,"秋刀鱼"},{2,"酱香鸡"}};
//2.插入
classroom.insert(pair<int,string>(3,"隆江猪"));
//3.遍历
auto iter = classroom.begin();//自动转型 "map<int,string> ::iterator"和"auto"一样
for(;iter!=classroom.end();){
cout << iter->first << iter->second << endl;
iter++;
}
//4.查询
auto findIter = classroom.find(4);//end指代的是map的最后的后一个元素"空"
if(findIter!=classroom.end()){
cout << findIter->first << findIter->second<<endl;
}
//5.删除
auto deleteIter = classroom.find(3);
classroom.erase(deleteIter);
iter = classroom.begin();//自动转型
for(;iter!=classroom.end();){
cout << iter->first << iter->second << endl;
iter++;
}
return 0;
}
附录(大部分map都能用的)
函数成员 | 函数功能 | array<T,N> | vector | deque |
---|---|---|---|---|
begin() | 返回指向容器中第一个元素的迭代器。 | 是 | 是 | 是 |
end() | 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。 | 是 | 是 | 是 |
rbegin() | 返回指向最后一个元素的迭代器。 | 是 | 是 | 是 |
rend() | 返回指向第一个元素所在位置前一个位置的迭代器。 | 是 | 是 | 是 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 | 是 | 是 | 是 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 | 是 | 是 | 是 |
crbegin() | 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 | 是 | 是 | 是 |
crend() | 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。 | 是 | 是 | 是 |
assign() | 用新元素替换原有内容。 | - | 是 | 是 |
operator=() | 复制同类型容器的元素,或者用初始化列表替换现有内容。 | 是 | 是 | 是 |
size() | 返回实际元素个数。 | 是 | 是 | 是 |
max_size() | 返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。 | 是 | 是 | 是 |
capacity() | 返回当前容量。 | - | 是 | - |
empty() | 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。 | 是 | 是 | 是 |
resize() | 改变实际元素的个数。 | - | 是 | 是 |
shrink _to_fit() | 将内存减少到等于当前元素实际所使用的大小。 | - | 是 | 是 |
front() | 返回第一个元素的引用。 | 是 | 是 | 是 |
back() | 返回最后一个元素的引用。 | 是 | 是 | 是 |
operator | 使用索引访问元素。 | 是 | 是 | 是 |
at() | 使用经过边界检査的索引访问元素。 | 是 | 是 | 是 |
push_back() | 在序列的尾部添加一个元素。 | - | 是 | 是 |
insert() | 在指定的位置插入一个或多个元素。 | - | 是 | 是 |
emplace() | 在指定的位置直接生成一个元素。 | - | 是 | 是 |
emplace_back() | 在序列尾部生成一个元素。 | - | 是 | 是 |
pop_back() | 移出序列尾部的元素。 | - | 是 | 是 |
erase() | 移出一个元素或一段元素。 | - | 是 | 是 |
clear() | 移出所有的元素,容器大小变为 0。 | - | 是 | 是 |
swap() | 交换两个容器的所有元素。 | 是 | 是 | 是 |
data() | 返回指向容器中第一个元素的指针。 | 是 | 是 | - |
map和unordered_map的区别
map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树)
unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。哈希表详细介绍
由这两个数据结构可以看出map的搜索时间虽然比不上unordered_map,但是由于map的底层是红黑树,建表时间是显著大于unordered_map
map | unordered_map | |
---|---|---|
底层 | 红黑树 | hashmap |
有序性 | ✔ | ✖ |
空间利用率 | 低(红黑树要存父节点) | 高 |
搜索效率 | 低 | 高 |
解决问题 | 有序的搜索,遍历 | 无序的存取 |
使用方法 | 一样 | 一样 |