8.18C++:关联容器、无序关联容器、集合(set)、upper_bound和lower_bound

关联容器的特点和接口

常用接口与顺序容器类似
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2 无序关联容器

  1. C++11新标准中定义了4个无序关联容器
    unorderedset、unorderedmap、unorderedmultiset、unorderedmultimap
  2. 不是使用比较运算符来组织元素的,而是通过一个哈希函数和键类型的==运算符。
  3. 提供了与有序容器相同的操作
  4. 可以直接定义关键字是内置类型的无序容器。
  5. 不能直接定义关键字类型为自定义类的无序容器,如果需要,必须提供我们自己的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

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这个值。

必须应用于非降序列,因为其原理是二分法查找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值