之前只是在C++ Primer里面看过关联容器,可能因为没有实际用过,只是看看,所以导致用的时候并不熟悉;
在这之前,map和set的特性应该要了解,map是关联数组,也就是由键值对组成的,而set只是关键字的集合,但是两者都只允许关键字是唯一的,也就是对于一个给定的关键字,它只能允许一个元素的关键字等于它;
但是,容器multimap和multiset并没有这个限制,它们都允许多个元素具有相同的关键字。
如何访问multimap呢,也就是如何查找元素呢?
这个时候需要先了解multimap的函数:
find(k) 返回第一个关键字为k的迭代器
count(k) 返回关键字等于k的个数
lower_bound(k) 返回第一个关键字不小于k的元素
upper_bound(k) 返回第一个关键字大于k的元素
equal_bound(k) 上面返回的是迭代器,但是这里返回的迭代器pair,表示关键字等于k的元素的范围,若k不存在,pair的两个成员均等于end()
注意:多个相同的关键字存储在容器中时,则会相邻存储;
根据以上的函数,可以使用三种方法进行查找元素
第一种方法:find + count
multimap<string, int> maps;
string word("word");
//注意是第一个出现的
auto itr = maps.find(word);
auto cnt = maps.count(word);
//循环便利
while (cnt) {
cout << itr->second << endl;
++itr;
cnt--;
}
第二种方法:lower_bound + upper_bound
multimap<string, int> maps;
string word("word");
//其实就是一个区间,因为存储位置连续
for (auto beg = maps.lower_bound(word), end = maps.upper_bound(word); beg != end; ++beg) {
cout << beg->second << endl;
}
第三种方法:equal_range
multimap<string, int> maps;
string word("word");
// 和上面不一样,直接返回一个区间
for (auto pos = maps.equal_range(word); pos.first != maps.end(); ++pos.first) {
cout << pos.first->second << endl;
}
对了还有unordered,这是没有进行排序的,同样的这些无序容器同样有重复关键字的版本-unordered_multimap,unordered_multiset,这些是用哈希函数实现,没有unordered的则是用红黑树实现的。