11.2.2关键字类型的要求
- 在实际编程中,重要的是,如果一个类型定义了“行为正常”的<运算符,则他可以用作关键字类型。
用来组织一个容器中元素的操作的类型也是该容器类型的一部分,为了指定使用自定义的操作,必须在定义关联容器类型是提供此操作的类型。自定义的操作类型必须在尖括号中紧跟元素类型给出
//定义了比较函数,比较操作类型应该是一种函数指针类型
multiset<Sales_data,decltype(compareIsbn)*> bookstore(compareIsbn);在尖括号中出现的每个类型,就仅仅是一个类型而已。当我们创建一个容器对象时,才会以构造函数参数的形式提供真正的比较操作,其类型必须与在尖括号中指定的类型想吻合。在2中,用compareIsbn来初始化bookstore对象,忙着表示当我们想bookstore中添加元素时,通过调用compareIsbn来为这些元素排序。
11.3.1 关联容器迭代器
- map的value_type是一个pair类型,first成员保存const关键字,记住,关键字时const类型的。我们可以改变pair的值,但是不能改变关键字成员的值。
- 与不能改变map中元素的关键字一样,一个set中的关键字也是const的。
- 用迭代器遍历关联容器
- 我们通常不对关联容器使用泛型算法
11.3.2 添加元素
- 对于map和set,接受单个元素的insert返回一个pair,first是一个迭代器指向具有给定关键字的元素,second是bool指示是否添加成功
- 对于multimap和multiset,返回一个指向新元素的迭代器,无需bool值,因为总是成功添加
- 对于map和set,insert插入一个已经存在的元素,insert什么也不做
11.3.3 删除元素
- 特殊版本erase:
c.erase(k);//从c中删除每个关键字为k的元素,翻译一个size_type值,指出删除的而元素的数量
11.3.4 map的下标操作
- set类型不支持下标,因为set中没有与关键字相关联的值
- 若关键字不在map中,下标操作会创建一个元素插入到map中,关联值进行值初始化
- 由于下标运算符可能插入一个新元素,我们只可以对非const的map使用下标操作
11.3.5 访问元素
c.lower_bound(k);//返回一个迭代器,指向第一个关键字不小于k的元素
c.upper_bound(k);//返回一个迭代器,指向第一个关键字大于k的元素
- 若1和2的返回值相同,说明元素不在容器中
- 若果关键字不在容器中,lower_bound会返回关键字的第一个安全插入点-————不影响容器中元素顺序的插入位置
c.equal_range(k);//返回一个迭代器pair,表示关键字等于k的元素范围。若k不存在,pair的两个成员军等于c.end()
11.3.6 一个单词转换程序重要!!!:map的下标操作和insert操作的区别:
trans_map[key]=value.substr(1);
trans_map.insert({key,value.substr(1)});
前者:若map中有相同的key,则最后一个相关的mapped_value值存入map中。后者:若map中有相同的key,什么都不做,即不会对原来key对应的mapped_value值造成任何影响。