集合set和映射map(哈希表)
集合set
无序集合unordered_set(要包含头文件unordered_set)
定义:unordered_set<int>
插入:s.insert(key)
查找:s.find(key)(返回的是目标元素的迭代器,若没找到返回end())
统计:s.count(key)统计key的个数</int>
有序集合set(要包含头文件set)
注意:默认排序是从小到大,如果要从大到小,需要自己利用仿函数构造(类)比较器,在定义set的时候在尖括号里加上比较器的名称
如果是自定义数据类型,则必须加比较器,否则编译器不知道如何进行排序
[定义比较器时]一定要加两个const
class myCompare { public: bool operator()(const Node& node1,const Node& node2) const { return node1.m_data > node2.m_data; } }; set<Node,myCompare> s;
映射map
无序映射unordered_map(要包含头文件unordered_map)
定义:unordered_map<int,string>
插入:m.insert(make_pair(key,value))
查找:m.find(key)
统计:m.count(key)
取元素:key是it->first,value是it->second
有序映射map(要包含头文件map)
注意:默认排序是按照key从小到大,如果要从大到小,需要自己利用仿函数构造(类)比较器,在定义set的时候在尖括号里加上比较器的名称
如果是自定义数据类型,则必须加比较器,否则编译器不知道如何进行排序
class myCompare2 { public: bool operator()(const Node& node1, const Node& node2) const { return node1.m_data > node2.m_data; } }; map<Node, int,myCompare2> m; Node node1(17, "mao"); Node node2(21, "xin"); Node node3(23, "qing"); Node node4(34, "yu"); Node node5(25, "hang"); m.insert(make_pair(node1, 95)); m.insert(make_pair(node2, 92)); m.insert(make_pair(node3, 91)); m.insert(make_pair(node4, 87)); m.insert(make_pair(node5, 84)); for (map<Node, int, myCompare2>::iterator it = m.begin(); it != m.end(); it++) { cout << "年龄: " << it->first.m_data << "姓名:" << it->first.m_name << "分数:" << it->second << endl; }