关联容器的特点和接口
常用接口与顺序容器类似
2 无序关联容器
- C++11新标准中定义了4个无序关联容器
unorderedset、unorderedmap、unorderedmultiset、unorderedmultimap - 不是使用比较运算符来组织元素的,而是通过一个哈希函数和键类型的==运算符。
- 提供了与有序容器相同的操作
- 可以直接定义关键字是内置类型的无序容器。
- 不能直接定义关键字类型为自定义类的无序容器,如果需要,必须提供我们自己的hash模板
3 集合(set)
#include <iostream>
#include <iterator> //包含copy函数
#include <set>
#include <utility> //包含pair
using namespace std;
int main()
//输入一串实数,将重复的去掉,取最大和最小者的中值,分别输出小于等于此中值和大于等于此中值的实数
{
set<double> s;
while (1) {
double v;
cin >> v;
if (v == 0) // 输入0表示结束
break;
pair<set<double>::iterator, bool> r = s.insert(v); //set.insert(单参数)的返回值是一个pair
//可以用auto r = s.insert(v); 来代替上述。
if (!r.second) //如果插入值已存在,pair的布尔值返回false
cout << v << " is duplicated" << endl;
}
set<double>::iterator iter1 = s.begin(); //获取集合的首元素迭代器
set<double>::iterator iter2 = s.end(); //获取集合的第二个元素迭代器
double medium = (*iter1 + *(--iter2)) / 2;
cout << "<= medium 的数有:";
copy(s.begin(), s.upper_bound(medium), ostream_iterator<double>(cout, " "));
cout << endl;
cout << ">= medium 的数有:";
copy(s.lower_bound(medium), s.end(), ostream_iterator<double>(cout, " "));
cout << endl;
return 0;
}
pair包含在头文件< utility >中 Primer P379
集合的单元素insert()函数返回值是pair对组型。队组的第一个成员是指向欲插入元素的迭代器,第二个成员是一个布尔量,表示本次操作是否成功。
如果元素已存在于集合中,first指向集合中的已存在元素,second返回false;
4 upper_bound和lower_bound
lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。
二者的命名方式显示了其用法
lower_bound的判定条件是大于等于,所以用其作下界,可以包含num这个值。
upper_bound的判定条件是大于,用其作上届正好可以包含num这个值。
必须应用于非降序列,因为其原理是二分法查找