• 关联容器类型和操作


    关联容器额外的类型别名:

    类型别名解释
    key_type 此容器类型的关键字类型
    mapped_type 关键字关联的类型,只适用于map
    value_type 对于map,是pair<const key_type, mapped_type>;
    对于set,和key_type相同。

    关联容器迭代器

    auto / set<int>::iterator  set_it = iset.begin();

    ++set_it(递增)/*set_it(解引用读值)/*map_it = val;(赋值 set只能访问)

    • 解引用一个关联容器迭代器时,会得到一个类型为容器的value_type的值的引用。
    • set的迭代器是const的。
    • 遍历关联容器:使用beginend,遍历mapmultimapsetmultiset时,迭代器按关键字升序遍历元素。

    添加元素

    关联容器insert操作:

    insert操作关联容器
    c.insert(v) 
    c.emplace(args)
    vvalue_type类型的对象;args用来构造一个元素。函数返回一个pair,包含一个迭代器,指向具有指定关键字的元素,以及一个指示插入是否成功的bool值(可用于检测插入是否成功)。
    对于mapset,只有元素的关键字不存在c中才插入或构造元素。对于multimapmultiset总是会插入成功的并返回一个指向插入元素的迭代器
    c.insert(b,e) 
    c.insert(il)
    be是迭代器,表示一个c::value_type类型值的范围;il是这种值的花括号列表。函数返回void
    对于 mapset,只插入关键字不在c中的元素。对于multimapmultiset总是会插入范围中的每一个值。
    c.insert(p,v) 
    c.emplace(p,args)
    类似insert(v),但将迭代器p作为一个提示,指出从哪里开始搜索新元素应该存储的位置。返回一个迭代器,指向具有给定关键字的元素。

    map添加元素的四种方法(因为map的元素类型是pair,要想插入的数据没有现成的pair需要在insert的参列中创建一个pair):

    • word_count.insert({word, 1});
    • word_count.insert(make_pair(word, 1));
    • word_count.insert(pair<string, size_t>(word, 1));
    • word_count.insert(map<string, size_t>::value_type (word, 1));

    删除元素

    从关联容器中删除元素:

    操作解释
    c.erase(k) c中删除每个关键字为k的元素。返回一个size_type值,指出删除的元素的数量。
    c.erase(p) c中删除迭代器p指定的元素。p必须指向c中一个真实元素,不能等于c.end()。返回一个指向p之后元素的迭代器,若p指向c中的尾元素,则返回c.end()
    c.erase(b, e) 删除迭代器对be所表示范围中的元素。返回e

    下标操作

    mapunordered_map的下标操作:

    操作解释
    c[k] 返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其值初始化。
    c.at(k) 访问关键字为k的元素,带参数检查;若k不存在在c中,抛出一个out_of_range异常。
    • 下标和at操作只适用于非constmapunordered_map

    查找元素

    在一个关联容器中查找元素:

    操作解释
    c.find(k) 返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器
    c.count(k) 返回关键字等于k的元素的数量。对于不允许重复关键字的容器,返回值永远是0或1。
    c.lower_bound(k) 返回一个迭代器,指向第一个关键字不小于k的元素。
    c.upper_bound(k) 返回一个迭代器,指向第一个关键字大于k的元素。
    c.equal_range(k) 返回一个迭代器pair,表示关键字等于k的元素的范围。若k不存在,pair的两个成员均等于c.end()
    • lower_boundupper_bound不适用于无序容器。

    无序容器


    • 有序容器使用比较运算符来组织元素;无序容器使用哈希函数hash<key_type>和 关键字类型的运算符==。
    • 无序容器的性能依赖于哈希函数的质量和桶的大小和个数
    • 无序容器在存储上组织为一组桶(bucket),每个桶保存零个或多个元素。无序容器使用一个哈希函数将元素映射到桶。(某些特定哈希值和具有相同关键字的元素放在一个桶中)
    • 同一个桶保存多个元素时需要顺序搜索找到想要的那个, 计算一个元素的哈希值和在桶中搜索是很快的操作。

    无序容器管理操作:

    操作解释
    桶接口  
    c.bucket_count() 正在使用的桶的数目
    c.max_bucket_count() 容器能容纳的最多的桶的数目
    c.bucket_size(n) n个桶中有多少个元素
    c.bucket(k) 关键字为k的元素在哪个桶中
    桶迭代  
    local_iterator 可以用来访问桶中元素的迭代器类型
    const_local_iterator 桶迭代器的const版本
    c.begin(n)c.end(n) n的首元素迭代器
    c.cbegin(n)c.cend(n) 与前两个函数类似,但返回const_local_iterator
    哈希策略  
    c.load_factor() 每个桶的平均元素数量,返回float值。
    c.max_load_factor() c试图维护的平均比桶大小,返回float值。c会在需要时添加新的桶,以使得load_factor<=max_load_factor
    c.rehash(n) 重组存储,使得bucket_count>=n,且bucket_count>size/max_load_factor
    c.reverse(n) 重组存储,使得c可以保存n个元素且不必rehash
    • 除了哈希管理操作之外,无序容器还提供了与有序容器相同的操作
  • 相关阅读:
    剑指Offer-二维数组中的查找
    我的心灵鸡汤
    生活经验总结与感受
    剑指offer-二叉树按之字形打印
    5月总结与回顾
    一致性Hash原理
    B树和B+树的区别
    Java内存区域模型
    解决Hash冲突的四种方法
    Go Web项目搭建-Gin+GORM连接MySQL数据库
  • 原文地址:https://www.cnblogs.com/Real-Ying/p/12806468.html
Copyright © 2020-2023  润新知