生成pair类型对象的三种方法
pair<string, int> word;
word.first = "hello";
word.second = 12;
pair<string, int> word2("world", 13);
pair<string, int> word3;
word3 = make_pair<string, int>("foo", 15);
map
-
map为一个容器,里面是有序的pair对象,其中的元素可以用迭代器遍历,也可以使用for (pair<> &p : m)来遍历;
-
map的插入和查询和插入都可以直接使用下标,但使用下标来查询极不安全,因为当下标表达式一写出来,若没有这个key值,会自动插入一个value为0 的pair对象,使用下标插入的时候,也无法获知是否已存在这个key值
-
利用上面的那个特性,在统计词频的时候,直接使用
while(cin -> word) words[word] ++;
就OK。
-
为了解决上面的问题,可以使用m.insert(make_pair())函数来解决插入的问题,它返回一个pair对象ret,其中ret.second在key值已经存在的情况下,会返回false,ret.first保存这个key值得迭代器,相反,若key不存在,会插入这个pair,first为m.end(),secend为ture
-
m.count(key)函数返回key值出现的次数,若key存在则返回1,否则返回0
-
m.find(key)返回找到key值得迭代器,或者m.end();
set
- set<> s;使用s.insert()来插入元素,自动排序
- s.find(key);实现查询返回该key的迭代器
map和set比较:
- 二者均使用红黑树实现
- key需要支持<操作
- map侧重于key-value的快速查找
- set侧重于查看元素是否存在
- map和set中的元素无法排序。