这里写目录标题
- 1.map介绍
- 2.map的方法
- find()用法
- erase()用法
- map的添加元素
- swap()用法
- lower_bound()和upper_bound()用法
- 3.访问map
- 4.map的第三个参数—————仿函数
1.map介绍
1.map中的所有元素都是pair,pair中第一个元素为key(键值),起到了索引的作用,第二个元素为value(实值),所有元素都会根据元素的键值按照一定的准则进行排序
2.Map,也叫关联数组,提供key/value(键/值对),key用来索引,value是被存储和检索的数据。
3.Map的内部数据结构是红黑树。
2.map的方法
方法 | 含义 |
mp.find(key) | 返回键为key的映射的迭代器 O(logN) 注意:用find函数来定位数据出现位置,它返回一个迭代器。当数据存在时,返回数据所在位置的迭代器,数据不存在时,返回mp.end() |
mp.erase(it) | 删除迭代器对应的键值O(1) |
mp.erase(key) | 根据映射的键删除键和值 O(logN) |
mp.erase(first,last) | 删除左闭右开区间迭代器对应的键和值 O(last-first) |
mp.size() | 返回映射的对数 O(1) |
mp.clear() | 清空map中的所有元素 O(N) |
mp.insert() | 插入元素,插入时要构造键值对 |
mp.empty() | 如果map为空,返回true,否则返回false |
mp.begin() | 返回指向map第一个元素的迭代器(地址) |
mp.end() | 返回指向map尾部的迭代器(最后一个元素的下一个地址) |
mp.rbegin() | 返回指向map最后一个元素的迭代器(地址) |
mp.rend() | 返回指向map第一个元素前面(上一个)的逆向迭代器(地址) |
mp.count(key) | 查看元素是否存在,因为map中键是唯一的,所以存在返回1,不存在返回0 |
mp.lower_bound() | 返回一个迭代器,指向键值>= key的第一个元素 |
mp.upper_bound() | 返回一个迭代器,指向键值> key的第一个元素 |
find()用法
map<string, float> m;
map<string, float>::iterator iter;
m["apple"] = 4.5f;
m["orangle"] = 7.0f;
iter = m.find("apple");
cout << iter->first << " " << iter->second << endl;
erase()用法
m["apple"] = 4.5f;
m["orangle"] = 7.0f;
m.erase("apple");
m.erase(m.begin(), --m.end());//和上面功能一样
---------------------------------------------------------------------------------------------------------------------------------------
map的添加元素
方法 一:直接赋值
m["apple"] = 4.5f;
m["orangle"] = 7.0f;
方法二:insert()+pair
mm.insert(pair<int, int>(1, 11));
mm.insert(pair<int, int>(4, 44));
mm.insert(pair<int, int>(2, 22));
方法三:利用另一个map对象直接赋值
map<int, int> mp(mm);
方法四:value_type()+insert()
mp.insert(map<int, int>::value_type(5, 55));
方法五:make_pair()
mm.insert(make_pair(0, 00));
swap()用法
mm.swap(mp);
lower_bound()和upper_bound()用法
mp.lower_bound : 返回的是第一个大于、等于key的iterator,如果没有则返回空。
mp.upper_bound :返回的是第一个大于key的iterator,如果没有,则返回空
3.访问map
方法 一:迭代器访问
map<string, float>::iterator iter;
for(iter = mp.begin(); iter != mp.end(); iter++)
{
// 键 值
// iter是结构体指针访问所以要用 -> 访问
cout << it->first << " " << it->second << "\n";
//*iter是结构体变量 访问要用 . 访问
//cout<<(*iter).first<<" "<<(*iter).second;
}
方法二:auto指针访问
for(auto i : mp)
cout << i.first << " " << i.second << endl;//键,值
方法三:利用find()对单个键值进行访问
map<char,int>::iterator it = mp.find('a');
cout << it -> first << " " << it->second << "\n";
4.map的第三个参数—————仿函数
定义格式:
map<int, int, CMP> mc;
CMP代码:
实际对“()”进行运算符重载,写了一个从大到小的排序。
class CMP
{
public:
bool operator()(int a, int b)const
{
return a > b;
}
};
map<int, int, CMP> mc;
mc.insert(make_pair(3, 33));
mc.insert(pair<int, int>(0, 00));
mc.insert(map<int, int>::value_type(1, 11));
mc[4] = 44;
map<int, int, CMP>::iterator iter;
for (iter = mc.begin(); iter != mc.end(); iter++)
cout << iter->first << " " << iter->second << endl;