C++:关联容器

关联容器(associative-container)

  • 头文件

    • map 关键字-值对
    • multimap 允许关键字重复
  • 头文件

    • set 只储存关键字
    • multiset 允许关键字重复
  • <unordered_map>头文件

    • unordered_map 不保持关键字的顺序,使用哈希函数来组织元素。
    • unordered_multimap
  • <unorderer_set>头文件

    • unordered_set
    • unordered_multiset
  • 关联容器的迭代器都是双向的

  • 有序容器需关键字类型定义比较方法,默认使用<,其必须是在关键字类型上定义的一个严格弱序(strict weak ordering)

pair

  • pair<T1,T2> p
  • pair<T1,T2> p(v1, v2)
  • pair<T1,T2> p = {v1, v2}
  • make_pair(v1, v2) 返回一个用v1,v2初始化的pair,自动进行类型推断
  • p.first 数据成员 T1类型的对象
  • p.second 数据成员 T2类型的对象
  • p1 relop p2 关系运算符 只要p1.first relop p2.first 和 p1.second relop p2.second中有一个成立,p1 relop p2就成立
  • p1 == p2
  • p1 != p2

map

  • map<KeyType, ValueType> m
  • C++11值初始化:关键字-值对包围在花括号中 {key, value}
map<string, int> m = {{"Hello",1}, {"World",2},{"!",3}};
  • map<KeyType, ValueType, Compare> m 提供比较方法,KeyType没有定义<就必须提供比较方法。
  • m.key_type 类型:KeyType
  • m.mapped_type 类型: ValueType
  • m.value_type 类型:pair<const KeyType, ValueType>
  • 对map容器的迭代器解引用或使用下标将得到value_type类型的对象,即pair<const KeyType, ValueType>
  • 关键字不能修改,只能修改值
  • m.begin()
  • m.end()
  • m.insert(v) 应传入相应的pair类型
  • m.emplace(args) 构造一个元素
  • m.insert(p, v) / c.emplace(p, args) p为一个迭代器,作为一个提示,指出从哪里开始搜索新元素应该储存的位置。
  • m.insert(b,e)
  • m.insert(il)
  • 插入相同的关键字对容器无影响
  • insert和emplace返回一个pair,包含一个迭代器,指向具有指定关键字的元素,以及一个指示插入是否成功的bool值
  • insert(b,e)/insert(il)时返回void
  • m.[key] (map/unordered_map拥有) 返回关键字为key的元素(pair),如果关键字不存在,则在map中新建一个元素
  • c.at[key] 带参数检测的访问,不存在则抛出out_of_range

set

  • set s
  • set s = {…}
  • s.key_type 类型: KeyType
  • s.value_type 类型: 与key_type相同,KeyType
  • set的关键字不能修改,即使使用iterator
  • m.begin()
  • m.end()

insert的返回值

  • map/set 不可插入重复关键字的,insert重复关键字时什么也不做->返回pair
    • first为指向具有给定关键字的元素的迭代器
    • second为bool类型,true表示插入成功,false表示未成功(重复)
  • multimap/multiset 可插入重复关键字的->返回迭代器

erase

  • c.erase§ 接收迭代器,返回后一个元素的迭代器
  • c.erase(b,e) 接收迭代器范围,返回e
  • c.erase(key) 接收关键字,返回删除的元素的个数

元素访问

  • c.find(k) 返回第一个关键字为k的元素的迭代器,不存在返回尾后迭代器
  • c.count(k) 返回数量
  • c.lower_bound(k) 返回迭代器,指向第一个关键字大于等于k的元素
  • c.upper_bound(k) 返回迭代器,指向第一个关键字大于k的元素
  • c.equal_range(k) 返回一个迭代器pair,指示关键字等于k的元素的范围

无序容器(unorder associative container)

不使用比较运算符组织元素,而使用哈希函数(hash function)和关键字的==运算符

  • 标准库为内置类型,string,智能指针提供了hash模板(hash<key_type> 可调用对象类型)来生成元素的哈希值->可以直接定义它们的无序容器
  • 为自定义类型提供hash函数,和==
size_t hasher(const A& rhs){
    return ...;
}

bool equation(const A& a, const A& b){
    return ...;
}

unordered_map<A, int, decltype(hasher)* , decltype(equation)* > um(42, hasher, equation);    //参数:桶大小,hash函数,比较函数
//如果类型有==操作,可以不传递
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

绫零依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值