三、关联式容器--有序

三、关联式容器–有序

标签(空格分隔): c++STL


关联式容器是关联式数组概念的推广
- 依据特定的排序规则,自动为其元素排序
- 由二叉树实现
- 提供对元素的快速访问

主要的有序关联式容器有:
- set:关键字和数据文件是同一个值。具有唯一性
- multiset:类似,但是包含重复的元素
- map: 成对数据的容器。键值对,唯一性
- multimap:类似,可以重复

无序关联容器:
- unordered_map:
- unordered_multimap
- unordered_set
- unordered_multiset

1.set/multiset类模板

1.定义

声明:

template <class Key,class Traits=less<key>,class Allocator= allocator<Key> > class set;
  • key: 存储数据类型
  • Traits : 实现内部排序的仿函数,默认参数
  • Allocator: 内存配置器

说明一下排序规则:
- 反对称的: x<y为真,则x>y 为假
- 可传递的: x<y,y<z为真,则x<z为真
- 非自反的: 对于operator<,x<x永远为假,是不可能的,对于判断式predicate op()而言,op(x,x)永远为假。
因此,在具体实现排序规则的时候:
有两种形式:
- 在模板中以参数形式实现
- 以构造函数参数定义
传递函数对象。
greater<T>less<T> 函数对象模板,定义在functional头文件中

自定义排序规则:

std::set<int,std::greater<int> > s1;//第一种方法
set<int>s2(less<int>());  //第二种方式

初始化:

set<T> s;
set<T> s1(s);
set<T> s ={T1,T2,..} //初始化列表的方法
等等

2.容量

  • empty
  • size
  • max_size

3.迭代器

  • begin()和end()
  • rbegin()和rend()

4.修改器

赋值:
- emplace 就地构造元素
- insert 插入一个元素
删除:
- erase 删除元素
- clear 删除全部内容
- swap 交换内容

5.查找

  • count 返回匹配特定键的元素数量
  • find 寻找特定键的元素
  • equal_range 返回特定键的元素范围
  • lower_bound 返回一个迭代器,指向第一个“不小于”给定值的元素
  • upper_bound 类似,返回第一个“大于”给定值的元素

6.查询

  • key_comp 返回用于比较键的函数
  • value_comp 返回用于在value_type类型的钟祥中比较键的函数
    原型:
key_compare key_comp()const;
key_compare value_comp() const;

key_compare 决定集合中的排列顺序。
使用方法:

set<T> s;
set<T>::key_compare func = s.key_comp();

7.非成员函数

  • operator==
  • operator!=
  • operator<
  • operator<=
  • operator>
  • operator>=

例子:

#include <set>
template <typename T>
void printsetvalue( set<T> s){
    cout << "set: ";
    set<T>::const_iterator it;
    for (it = s.begin(); it != s.end(); ++it)
        cout << *it << "  " ;
    cout << endl;
}

int main()
{
    set<string> s = {"abd","car","bar","dat","fore","male","dela"};
    set<string>::iterator iter;
    pair<set<string>::iterator, set<string>::iterator> p;
    cout << "--------insert---------" << endl;
    s.insert("wa_ha_ha");
    s.insert("ma_ma_ma");
    printsetvalue(s) ;
    cout << "---------equal_range--------" << endl;
    p = s.equal_range("dat");
    cout << "不小于的第一个值:" << *p.first<< endl;
    cout << "大于的第一个值:" << *p.second << endl;
    cout << "---------lower_bound 和upper_bound --------" << endl;
    iter = s.lower_bound("dat");
    cout << "不小于的第一个值:" << *iter<< endl;
    iter = s.upper_bound("dat");
    cout << "大于的第一个值:" << *iter << endl;

}

输出为:

--------insert---------
set: abd  bar  car  dat  dela  fore  ma_ma_ma  male  wa_ha_ha
---------equal_range--------
不小于的第一个值:dat
大于的第一个值:dela
---------lower_bound 和upper_bound --------
不小于的第一个值:dat
大于的第一个值:dela

2.map/mutilmap类模板

两个类型基本一致。

1.定义和初始化

构造函数:

构造函数备注
map c / multimap c产生一个空的map或者multimap
map c(op) /multimap c(op)产生一个以op为准则,空的map/multimap
map c1(c) / multimap c2(c)产生c 的副本
map c(beg,end) / multimap c(beg,end)用迭代器范围产生一个新map/multimap
map c(beg,end,op) / multimap c(beg,end,op)以op为排序规则,用迭代器产生

排序形式:

map效果
map<key,Elem> / multimap<key,Elem>以less()为排序准则
map<key,Elem,op>/multimap<key,Elem,op>以op为准则

2.元素的访问和容量

元素的访问:
- at() (c++11):不存在,返回out_of_range 异常
- operator[k]:若k不存在,则添加关键字k,并且初始化
容量:
- empty
- size
- max_size

3.迭代器

  • begin()和end()
  • rbegin()和rend()

4.修改器

赋值:
- emplace
- insert
删除:
- clear
- erase
- swap

5.查找

  • count 返回匹配特定键的元素数量
  • find 寻找特定键的元素
  • equal_range 返回特定键的元素范围
  • lower_bound 返回一个迭代器,指向第一个“不小于”给定值的元素
  • upper_bound 类似,返回第一个“大于”给定值的元素

6.查询

  • key_comp 返回用于比较键的函数
  • value_comp 返回用于在value_type类型的钟祥中比较键的函数

7.非成员函数

  • operator==
  • operator!=
  • operator<
  • operator<=
  • operator>
  • operator>=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值