1、关键字类型要求
对于有序容器——map、multimap、set、multiset,关键字类型必须定义元素比较的方法。默认情况下,标准库使用<运算符比较关键字。
习题11.10:可以定义vector<int>::iterator到int的map,但是不能定义list<int>::iterator到int的map。因为list的迭代器不支持比较运算。
2、关联容器的迭代器
map的迭代器的first成员保存的是const 的关键字,set的迭代器是const的,虽然他也定义了一个iterator和一个const iterator。
std::map<std::string, int> simap{ {"a",1} };
std::set<int> iset{ 1,2,3 };
auto map_itr = simap.begin();
auto set_itr = iset.begin();
map_itr->second = 2;
map_itr->first = "b"; //错误 关键字是const的
*set_itr = 5; //错误 set的关键字是const的
3、遍历关联容器
当使用一个迭代器遍历一个map、multimap、set或multiset时。迭代器按关键字升序遍历元素。
4、map的下标操作
map提供下标运算符 [] 和一个对应的at函数。与其他下标运算符不同的是 若关键字不存在,则创建一个元素插入,而at函数不会
map<int, int> map2; // 0
cout << map2.size() << endl;
if (map2[5]) {} // 正确 会添加一个{5,0}
if (map2.at(4)) {} //错误 抛出out_of_range异常
cout << map2.size() << endl; // 1
5、无序容器对关键字类型的要求
标准库为内置类型(包括指针)提供了hash模板,还有一些标准库类型,包括string和只能指针定义了hash,因此可以直接使用这些类型的无序容器,但不能直接定义关键字类型为自定义类类型的无序容器。