关闭

c++ primer学习笔记 第 10 章 关联容器

159人阅读 评论(0) 收藏 举报
分类:
第 10 章 关联容器
定义:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素
              
关联容器的类型:
          Map和set都是按键的顺序存储的。
Map:关联数组(键值对)
Set:仅包含一个键
Multimap:支持同一个键出现多次的map类型
Multiset:支持同一个键出现多次的set类型

一、     引言:pair类型
Pair类型提供的操作
表10-2







值初始化是什么意思?
     如果没有指定元素的初始化式,那么标准库将自行提供一个元素初始值进行值初始化,如果是内置类型(int就用0);如果含有构造函数,就用默认构造函数。如果是一个没有构造函数的类,标准库就会对该对象的每个成员进行值初始化。

p.first 可以直接赋值吗?
     可以,因为是公有的成员。

Make_pair()所创建的pair如何使用它呢?他返回什么东西?
pair <strng,string> next_auth;
next_auth = make_pair(first,last);
     使用这个应该要注意他的类型

二、     关联容器
关联容器共享大部分的操作。关联容器不提供front、push_front、push_front、pop_front、back、push_back、pop_back操作





三、     map类型
可使用键作为下标来获取一个值,正如内置数组类型一样。

1、     map对象的定义
构造函数




键类型的约束
     键必须定义小于操作符(所用的笔记哦啊函数必须定义严格弱排序,不能出现相互小于关系)

2、     map定义的类型





(1)map迭代器进行解引用将产生pair类型的对象value_type
(2)map容器额外定义的类型别名key_type和mapped_type以获得键或值的类型(typedef)。

3、     给map添加元素
可使用insert;或者使用下表操作符

4、     使用下标访问map对象
map<string, int> word_count;
word_count[“Anna”] = 1;
将发生以下事情:



(1)     下标操作符返回值的使用
返回左值,与键关联的值(迭代器返回的pair不同)
(2)     下标行为的编程意义
单词计数:
          map<string, int> word_count;
     string word;
while (cin >> word)
          ++word_count[word];
当第一次发现单词时,他会创建并插入一个以该单词为索引的新元素,同时将他的值初始化为0.然后立即加1.

5、     map::insert的使用



都是键值不存在才插入,存在的话原值不变。
(1)     用insert代替下标运算
用下标是是先进行值初始化,然后再赋值。使用下标更加紧凑。
Word_count.insert(map<string, int>::calue_type(“Anna”, 1));
通常使用Typedef 和make_pair简化
Typedef  map<string, int>::calue_type valType;
Word_count.insert(valType (“Anna”, 1));

Word_count.insert(make_pair (“Anna”, 1));

(2)     带迭代器参数的insert版本不说明是否有或者有多少元素插入。
带pair形参的会返回一个包含一个迭代器和一个bool值的pair对象
(3)     语法展开

6、     查找并读取map中的元素
使用下标很危险,因为会插入一个新的元素。map提供了两个操作count 和find



(1)     使用count检查map对象中某键是否存在(对于map返回值只能是0或者1)
(2)     Find操作返回指向元素的迭代器,如果不存在,返回end。键的值是const不能被修改

7、     从map对象中删除元素




其余erase带迭代器版本的与顺序容器不同的是返回值。Map返回的是void 顺序容器返回的是一个迭代器。
m.erase(key)  返回删除的元素个数,对于map只能是0或者1.

8、     map对象的迭代遍历
map同样提供了begin和end运算。

9、     “单词转换”map对象

四、     set类型
set只是单纯的键的集合,当只想直到一个值是否存在时,使用set容器是最合适的。
支持的操作:
set不支持下标操作,而且没有定义mapped_type,他的alue_type是与key_type相同的类型。

1、     set容器的定义和使用
一个键只能对应一个元素
(1)     在set中添加元素set.insert(n),或者一个迭代器范围(返回值与map的insert一样)
(2)     从set中获取元素。使用find通过键从set中获取元素。使用Count判断是否存在。键的值是const不能被修改只能读。

2、     创建“单词排除”集
3、     如果要遍历他使用迭代器就可以了。
五、     multimap和multiset类型
允许一个键对应多个实例,所支持的操作分别与map和set相同。只有一个例外multimap不支持下标运算。
1、     元素的添加和删除
每次insert都会添加元素
带一个键参数的erase将删除该键的所有元素,并返回删除元素的个数;
带迭代器范围的值删除指定的元素,并返回void。

2、     在multimap和multiset中查找元素
如果某个键对应国歌实例,则这些实例相邻存放
(1)     使用find和count操作。
Typedef multimap<string,string> ::size_type sz_type;
Mulitmap<string, string> ::iterator iter = authors.find(search_item);
sz_type entries = authors.count(search_item);
for (sz_type cnt = 0; cnt != entries; ++cnt,++iter)
     cout <<iter->second->second <<endl;
从上面的代码可见,相同的元素是连在一起的而且是可以通过迭代器来访问的。
(2)     与众不同的面向迭代器的解决方案
Lower_bound 和upper_bound
表10-8



在同一个键上使用他们会产生一个迭代器范围,该键关联的所有值。如果键不存在,返回同一个迭代器,指向依据改建的顺序应该插入的位置。
(3)     equal_range函数返回一对迭代器的pair对象。第一个迭代器指向该键关联的第一个实例,第二个指向最后一个的下一个。

六、     容器的综合应用:文本查询程序
1、     查询程序的设计
2、     TextQuery类
3、     TextQuery类的使用
4、     编写成员函数
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4864次
    • 积分:189
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:3篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论