关联容器的特点和接口
常用接口与顺序容器类似 2 无序关联容器
- C++11新标准中定义了4个无序关联容器
unorderedset、unorderedmap、unorderedmultiset、unorderedmultimap - 不是使用比较运算符来组织元素的,而是通过一个哈希函数和键类型的==运算符。
- 提供了与有序容器相同的操作
- 可以直接定义关键字是内置类型的无序容器。
- 不能直接定义关键字类型为自定义类的无序容器,如果需要,必须提供我们自己的hash模板
3 集合(set)
#include <iostream>
#include <iterator>
#include <set>
#include <utility>
using namespace std;
int main()
{
set<double> s;
while (1) {
double v;
cin >> v;
if (v == 0)
break;
pair<set<double>::iterator, bool> r = s.insert(v);
if (!r.second)
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 >中 集合的单元素insert()函数返回值是pair对组型。队组的第一个成员是指向欲插入元素的迭代器,第二个成员是一个布尔量,表示本次操作是否成功。 如果元素已存在于集合中,first指向集合中的已存在元素,second返回false;
4 upper_bound和lower_bound
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这个值。
|