unordered_multiset学习之查找操作和观察器操作count,find, contains(C++20),equal_range,hash_function, key_eq

本篇学习unordered_multiset的查找操作和观察器操作,具体函数如下

count

(C++11)

返回匹配特定键的元素数量
(公开成员函数)

find

(C++11)

寻找带有特定键的元素
(公开成员函数)

contains

(C++20)

检查容器是否含有带特定键的元素
(公开成员函数)

equal_range

(C++11)

返回匹配特定键的元素范围
(公开成员函数)

hash_function

(C++11)

返回用于对键散列的函数
(公开成员函数)

key_eq

(C++11)

返回用于比较键的相等性的函数
(公开成员函数)

代码示例:

#include <unordered_set>
#include <string>
#include <time.h>
#include <iostream>

using namespace std;

void findOpertion()
{
    //1.count返回匹配特定键的元素数量
    std::unordered_multiset<int> set1 = {5, 2, 3, 4, 3, 3};
    int nkey = 0;
    for(nkey = 1; nkey < 6; ++nkey)
    {
        std::cout << nkey << " 在set1中有" << set1.count(nkey) << "个元素\n";

    }
    //2.find寻找带有特定键的元素,返回的是迭代器
    std::unordered_multiset<int> set2 = {62, 34, 18, 55};
    std::unordered_multiset<int, std::string>::iterator it;
    it = set2.find(18);
    if(it != set2.end())
        std::cout << "find element is " << *it << std::endl;
    else
        std::cout << "not find element\n";

    //3.equal_range返回匹配特定键的元素范围,返回容器中所有拥有给定关键的元素范围。
    //范围以二个迭代器定义,一个指向首个不小于 key 的元素,
    //另一个指向首个大于 key 的元素。首个迭代器可以换用 lower_bound() 获得,而第二迭代器可换用 upper_bound() 获得a
    std::unordered_multiset<int> set3 = {1, 7, 3, 12, 5};

    std::pair<unordered_multiset<int>::iterator, unordered_multiset<int>::iterator> it3;
    //print
    std::cout << "======================================\n";
    //it3 = set3.equal_range(2);//key一定要存在,否则抬的是end()迭代器
    it3 = set3.equal_range(3);
    std::cout << "lower bound points to: ";//返回的第一个迭代器不小于传进来的关键字的值
    std::cout << "start = " << *(it3.first) << std::endl;
    std::cout << "upper bound points to: ";//返回的第二个迭代器首个大于传进来的关键字的值
    std::cout << "end   = " << *(it3.second) << std::endl;

    //4.lower_bound
    std::unordered_multiset<int>::iterator lowerIt;
    lowerIt = set3.lower_bound(3);
    std::cout << "lower_bound(3) = " << *lowerIt << std::endl;

    //5.upper_bound
    std::unordered_multiset<int>::iterator upperIt;
    //upperIt = set3.upper_bound(4);//key一定要存在,否则抬的是end()迭代器a
    upperIt = set3.upper_bound(5);//这个有待研究,为什么5就不可以了,是最后一个元素的原因吗a
    if(upperIt != set3.end())
        std::cout << "upper_bound(5)  = " << *upperIt << std::endl;
    else
        std::cout << "not find iterator" << endl;

    //6. hash_function    返回对关键哈希的函数
    unordered_multiset<int> set6;
    unordered_multiset<int>::hasher fn = set6.hash_function();
    std::cout << "fn1 = " << fn(5) << " fn2 = " << fn(2) << std::endl;

    //7. key_eq 返回用于比较键的相等性的函数
    unordered_multiset<string, string> set7;
    bool case_insensitive = set7.key_eq()("camle","CAMLE");

    std::cout << "set7.key_eq() is ";
    std::cout << ( case_insensitive ? "case insensitive" : "case sensitive" );
    std::cout << std::endl;
    //case sensitive:区分大小写
    //case insensitive不区分大小写
}

int main()
{
    findOpertion();

    cout << "Hello, world!" << endl;
    return 0;
}

运行结果:

 

参考:

https://zh.cppreference.com/w/cpp/container/unordered_multiset

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值