目录
一、概述
二、用法
2.1、插入
2.2、拷贝与赋值
2.3、查找
2.4、删除
2.5、完整代码
三、其他成员类型
一、概述
map 与 multimap是存储key-value(键-值 对)类型的容器。不同之处在于:map只允许key与 value一一对应;multimap一个key可对应多个value;说白了map规定key值具有唯一性,而multimap不是。
上述使其不同之处,下面如果,不作特别说明,适用于map的都适用于multimap(见代码)
二、用法
2.1、插入
插入可以判断是否插入成功,完整代码见最后一节。下面代码中isInsertOK用于接受返回值,变量类型为:pair< map, int>::iterator, bool>;如果是新手还是像下面这样写一次;熟练以后,直接使用auto isInsertOK代替。
//声明,定义
std::map m;
m[3] = "h1";
m[0] = "what";
// 构建 key-value
m.insert(std::pair(2, "love you"));
2.2、拷贝与赋值
允许使用一个map初始化另一个map,如下代码,可以使用vecA初始化vecB。map也重载了等号,直接赋值。
map, int> vecB(vecA); //拷贝构造
map, int> vecC;
vecC = vecA;
vecC.swap(vecA);
2.3、查找
map中,用于查找功能的成员函数有很多,如下:
- lower_bound("china"); //指向vecD中第一个 = 键值 “china”对应的元素
- upper_bound("china"); //指向vecD中第一个 > 键值 “china”对应的元素
- equal_range("china"); //指向vecD中第一个 >= 键值 “china”对应的元素
- count("china"); //查找key = “china”键值对的个数
- find("china"); //查找key = “china”对应键值对
map vecD;
// 你以为按照下面初始化 vecD,他的size会是5? 由于insert方法不能覆盖,所以我们将map 改成 multimap
vecD.insert(pair((string)"china", 1));
vecD.insert(pair((string)"china", 2));//拒绝插入
vecD.insert(pair((string)"china", 3));//拒绝插入
vecD.insert(pair((string)"english", 1));
vecD.insert(pair((string)"english", 2));//拒绝插入
multimap vecE;
vecE.insert(make_pair((string)"china", 1));
vecE.insert(make_pair((string)"china", 1));//允许插入
vecE.insert(make_pair((string)"china", 3));//允许插入
vecE.insert(make_pair((string)"china", 4));//允许插入
vecE.insert(make_pair((string)"china", 5));//允许插入
vecE.insert(make_pair((string)"english", 1));
vecE.insert(make_pair((string)"english", 2));//允许插入
vecE.insert(make_pair((string)"america", 1));
vecE.insert(make_pair((string)"america", 2));//允许插入
vecE.insert(make_pair((string)"america", 3));//允许插入
cout << "multimap 初始化" << endl;
cout << "vecE所有元素"< ::iterator it1 = vecE.lower_bound("china"); //指向vecD中第一个等于键值 “china”对应的元素
multimap ::iterator it2 = vecE.upper_bound("china"); //指向vecD中第一个大于键值 “china”对应的元素
cout << it1->first << " " << it1->second << endl;
cout << it2->first << " " << it2->second << endl;
// 等于 = lower_bound + upper_bound
pair::iterator, multimap::iterator > it3 = vecE.equal_range("china");
map::iterator it4 = it3.first;
map::iterator it5 = it3.second;
//查找key = “china”键值对的个数
int iCount = vecE.count("china");
//查找key = “china”对应键值对
multimap::iterator it6 = vecE.find("china");
2.4、删除
可以删除multimap中key = "english"的 所有元素指定,直接调用erase函数。也可以删除指定地址范围内的元素,例如:vecE.erase(itBegin_, itEnd_);
multimap::iterator itBegin = vecE.begin();
// 删除 vecE 前面三个元素 与 后面 三个元素
// 在改善特征点匹配算法中有实践
int index = 0;
int vecA_size = vecE.size();
//删除(自定义删除任何元素)
for (multimap::iterator it_ = vecE.begin(); it_ != vecE.end(); )
{
//<1>法1
//vecE.erase(it_++);
//<2>法2
if ((0<=index)&&(index<=2))
{
it_ = vecE.erase(it_);//这样写,防止指针失效
}
else if (((vecA_size - 3) <= index) && (index <= (vecA_size - 1)))
{
it_ = vecE.erase(it_);
}
else
{
it_++;
}
++index;
}
//删除multimap中key = "english"的 所有 元素
vecE.erase("english");
cout << "vecE删除key = english的 所有 元素 " << endl;
printfB(vecE);
//删除所有元素
multimap::iterator itBegin_ = vecE.begin();
multimap::iterator itEnd_ = vecE.end();
vecE.erase(itBegin_, itEnd_);
//bool isEmpty = vecE.empty();
if (vecE.empty())
{
cout << "vecE已经被清空" << endl;
}
2.5、完整代码
#include
#include
三、其他成员类型
member type |
definition |
notes |
key_type |
The first template parameter (Key) |
|
mapped_type |
The second template parameter (T) |
|
value_type |
pair |
|
key_compare |
The third template parameter (Compare) |
defaults to: less |
value_compare |
Nested function class to compare elements |
see value_comp |
allocator_type |
The fourth template parameter (Alloc) |
defaults to: allocator |
reference |
value_type& |
|
const_reference |
const value_type& |
|
pointer |
allocator_traits::pointer |
for the default allocator: value_type* |
const_pointer |
allocator_traits::const_pointer |
for the default allocator: const value_type* |
iterator |
a bidirectional iterator to value_type |
convertible to const_iterator |
const_iterator |
a bidirectional iterator to const value_type |
|
reverse_iterator |
reverse_iterator |
|
const_reverse_iterator |
reverse_iterator |
|
difference_type |
a signed integral type, identical to: iterator_traits::difference_type |
usually the same as ptrdiff_t |
size_type |
an unsigned integral type that can represent any non-negative value of difference_type |
usually the same as size_t |
参考:https://cplusplus.com/reference/map/map/