一、前述
map容器为我们使用C++实现hash表带来了便捷。map以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map主要用于资料一对一映射(one-to-one)的情況,map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的,后边我们会见识到有序的好处。
二、map方法
- 初始化和插入数据
//-----1、直接赋值
map<int,int> mp;
mp[0]=0;
//-----2、列表初始化
map<string,int> mp={
{"string",1}, {"sec",2}, {"trd",3}
};
//-----3、insert方法
map<string, int> m2;
m2.insert({ "abc", 1 });
//使用pair类型
m2.insert(make_pair(string("def"), 2));
m2.insert(pair<string, int>(string("ghi"), 3));
- 查找元素
//1、------find方法,判断key是否存在
map<int,int> mp;
map<int,int>::iterator iter = mp.find("123");
if(iter!=mp.end()){
}
//2、------直接使用key引用
mp["123"];
注意:如果使用mp["123"],其表达的含义为:如果存在该键值则直接返回对应value,如果不存在则增加该key值并自动初始化为
- 删除和清空
//1、------使用迭代器【区间或者单独】
iter = mp.find("123");
mp.erase(iter);
//2、------直接删除对应键值
int n=mp.erase("123"); //如果删除返回1,否则返回0
//3、------清空
mp.clear(); -------相当于 mp.erase(mp.begin(),mp.end());
三、关于unordered_map
优点 | 缺点 | |
map | 利用红黑树实现了元素有序性 |
由于红黑树的建立,需要足够的空间存储节点,因此空间开销大 |
unordered_map | 仅仅建立哈希表而不排序,在查找的时候非常迅速也不需要过多的空间开销 | 建表费时间;无序性使得部分map操作效率降低 |
四、关于vector<pair<...>>
vector<pair<... , ....>>的存储也是起到了一个模拟map的功能,但其不会严格地具有哈希表的一一映射和键值去重属性,其各种方法仍然遵循vector的规则,只是操作对象变成了pair
因此,其无法根据pair的某一个值直接查找到对应的pair元素或者根据某一元素直接排序,
我们需要重载operator 的比较运算符才可以实现。
以find为例,这里使用了find_if:
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
// Functor
class isEqualALL {
public:
explicit isEqualALL(int UserVal) : User(UserVal) {}
bool operator() (const std::pair<int, int>& element) const {
return element.second == User;
}
private:
const int User;
};
int main(int argc, char *argv[])
{
vector<pair<int, int>> sortList;
sortList = {
pair<int, int>(1, 100),
pair<int, int>(2, 200),
pair<int, int>(3, 300),
pair<int, int>(4, 400),
};
cout << "初始值:" << endl;
for (auto &i : sortList) {
cout << i.first << ":" << i.second <<endl;
}
int myUser[] = {200, 400};
for (int i = 0; i < sizeof(myUser) / sizeof(int); i++) {
auto it = std::find_if( sortList.begin(), sortList.end(), isEqualALL(myUser[i]));
if (it != sortList.end()) {
sortList.erase(it);
}
cout <<"第" << i + 1 << "次删除后:///" << endl;
for (auto &i : sortList) {
cout << i.first << ":" << i.second <<endl;
}
}
return 0;
}
————————————————
版权声明:本代码来自CSDN博主「JustNow_Man」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/j_cou/article/details/83044739