关联容器(map、set)(一)

    1、关联容器和顺序容器的区别:

顺序容器的元素是“顺序”存储的(链表容器虽然在内存中不是连续存储,但仍然是按顺序存储的),底层的数据结构是数组和链表,每个元素含有唯一对应的编号,容器的操作就是按照编号来完成的,对于添加删除元素是比较高效的,但是对于值查找(find)来说需要遍历容器,所以效率比较低。

关联容器(map)的元素按照关键字值来存储的,底层结构为红黑树、哈希表等,对于按关键字值查找元素能高效的执行。

2、关联容器的基础概述

a、标准库定义了8种关联容器:1)两大类map(映射类型)、set(集合类型)(默认不允许重复关键字、有序保存);2)是否允许重复关键字(multiset、multimap);3)是否有序保存(unorderedset、unorderedmap);

b、map中的元素是关键字-值(key-value)对;map类型通常称为关联数组,其下标为关键字,通常用于字典型数据类型(姓名-电话之类);set中的元素就是关键字,通常用于坏值检测(银行失信名单);

map<string, int> name_telephone = { {"lanche",4252206},{"coral",4224025} };
set<string> name = { "xiao","ling","hao" };

 c、map、set的定义:还有同类型容器之间的初始化

map<string, int> name_tele;//空容器,默认初始化;
map<string,int> name_tele={{"xiao",045513},{"ling",566554}} 
set<int >= {1,2,3,6,5}							//值初始化;
set<int> iset(ivec.begin(),ivec.begin()) //迭代范围初始

 d、关键字类型的要求:在有序关联容器中,关键字默认使用“<”运算符来进行比较,因此类似于Sale_data之类的无"<"运算符的类类型就不能作为关键字类型,除非在尖括号中的元素类型后面添加自定义操作类型(指针-函数指针类型(尖括号中的类型仅仅只是一个类型,只有在创建容器时才会以构造函数的形式提供真正的比较操作):

boo compareIbsn(Sale_data &s1,Sale_data &s2)
{
return s1.isbn()<s2.isbn();
}
multiset<Sale_data,decltype(compareIsbn)*> bookstore(compareIsbn);//decltype返回函数类型,所以必须添加*;用compareIbsn初始化bookstore,每次向bookstore中添加元素时,通过调用compareIsbn来为这些元素排序

 e、

疑问:

1、删除string中的标点和空格,下面的方法编译不过,ispunct不能放入泛型算法中作谓词?

  1. #include <ctype.h>  
  2. #include <algorithm>  
  3.   
  4. str_testing.erase(   
  5.         remove_if ( str_testing.begin(), str_testing.end(), static_cast<int(*)(int)>(&ispunct) ),   
  6.         str_testing.end());   
  7.           
  8. str_testing.erase(   
  9.         remove_if ( str_testing.begin(), str_testing.end(), static_cast<int(*)(int)>(&isspace) ),   
  10.         str_testing.end());   



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值