语言基础(25):容器与算法

1、multimap和multiset 使用

之前只是在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()
注意:多个相同的关键字存储在容器中时,则会相邻存储;
根据以上的函数,可以使用三种方法进行查找元素,下面示例一个maps中包含一个较word的key;

1.1 第一种方法: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--;
}

1.2 第二种方法: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;
}

1.3 第三种方法: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;
}

multi_set的访问方法和上面类似,但是只存储键没有值!

对了还有unordered_map,它们是在c++11中如的使用工具,是没有进行排序的map,同样的这些无序容器同样有重复关键字的版本-unordered_multimap,unordered_multiset,这些是用哈希函数实现,没有unordered的则是用红黑树实现的。

2、STL算法库

算法库主要包含在下面两个头文件:

#include <algorithm>   //常用算法
#include <numeric>     //泛化的算术算法

主要包括了对容器乃至数组的操作:查找、写入、排序等通用型的和特定容器特有的操作,算法库计算效率高、通用型强,避免重复造轮子;

下面这篇文档介绍的特别好,就不再细说了:
STL算法

posted @ 2019-06-13 23:39  ningKing  阅读(154)  评论(0编辑  收藏  举报