###学习《C++ Primer》- 4
点击查看Evernote原文。
#@author: gr
#@date: 2014-10-16
#@email: forgerui@gmail.com
Part 4: STL关联容器(第11章)
一、pair
类型
pair
类型的数据成员是public
的,两个成员分别命名为first
, second
。
#下面两种造价
pair<string, string> p(v1, v2);
pair<string, string> p = {v1, v2};
#使用make_pair构造
make_pair(v.back(), v.back().size());
二、容器关键字
对于set
类型,key_type
和value_type
是一致的。在map
中,value_type
是pair
类型的,key_type
是键类型,mapped_type
是值的类型。
set<string>::value_type v1; //v1是一个string
set<string>::key_type v2; //v2是一个string
map<string, int>::value_type v3; //v3是一个pair<string, int>
map<string, int>::key_type v4; //v4是一个string
map<string, int>::mapped_type v5; //v5是一个int
三、关联容器迭代器
map
的value_type
类型是一个pair
类型,其first
成员是const
的,second
是成员保存值。
set
关键字也是const
的,可以用set迭代器读取其值,但不能修改。
四、添加元素
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));
map
的insert
的返回值是个pair
类型,first
代表迭代器,second
是bool
类型,表示是否插入成功,成功返回true
。
//返回值是个pair类型
pair< map<string, size_t>::iterator, bool> ret = word_cout.insert({word, 1});
cout<< ret.first->second << endl;
multimap
的insert
只会返回迭代器,因为它的插入总是成功的。
五、删除元素
三种erase
,一种是传递迭代器,返回void
;第二种是传递一组迭代器表示一个范围,erase(b, e);
,返回e;第三种是传递一个key_type
参数,删除匹配的关键字,返回删除元素的数量。
六、map
的下标操作
set
不支持下标操作。multimap
也没有,因为可能有多个匹配项。
下标操作如果存在会获取关联的值,如果不存在会自动创建该值插入到map
中。所以不能使用下标判断元素是否存在。
七、使用find
查找元素
find
接受一个key_value
类型值,返回一个迭代器。
c.find(k);
if (word_count.find("hello") == word_count.end())
cout << "the element is not in the map" << endl;
还可以使用cout
查找元素个数。
在multimap
或multiset
中查找元素。
string item = "Lee Seng";
auto entries = autors.count(item);
auto iter = authors.find(item);
while (entries){
cout << iter->second << endl;
++iter;
--entries;
}
lower_bound(k)
返回第一个关键字不小于k的元素,同理upper_bound()
返回第一个关键字大于k的元素。
for (auto beg = authors.lower_bound(item),
end = authors.upper_bound(item); beg != end; ++beg)
{
cout << beg->second << endl;
}
equal_range
整合了lower_bound
和upper_bound
,返回一个pair
,first
是lower_bound
的结果,second
是upper_bound
的结果。
for (auto range = authors.equal_range(item); range.first != range.second; ++range.first)
{
cout << range.first->second << endl;
}
八、无序容器
新标准定义了4个无序关联容器,分别在基础的容器前加上unordered_
,分别是unordered_map
, unordered_multimap
, unordered_set
,unordered_multiset
。它们不使用比较运算符而使用哈希函数来组织元素。
定义自己的hash函数和==运算符。
//hash函数
size_t hasher(const Sales_data& sd){
return hash<string>()(sd.isbn());
}
//==运算符
bool eqOp(const Sales_data& lhs, const Sales_data& rhs){
return lhs.isbn() == rhs.isbn();
}
//定义一个unordered_multiset类型别名
using SD_multiset = unordered_multiset(Sales_data, decltype(hasher)*, decltyhpe(eqOp)*);
SD_multiset bookstore(42, hasher, eqOp);
###学习《C++ Primer》- 4的更多相关文章
- 学习C++ Primer 的个人理解(一)
<C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐< ...
- 学习C++ Primer 的个人理解(九)
这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很 ...
- 学习C++ Primer 的个人理解(三)
第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...
- 学习C++ Primer 的个人理解(二)
本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...
- 学习C++.Primer.Plus 11 使用类
1.操作符重载 重载操作符的几个限制: a) 重载的至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符. b) 不能违反操作符原有来的句法规则. c) ...
- 学习C++.Primer.Plus 10 对象和类
1.类的声明和定义 类的声明和定义. 类声明的格式如下: class className { private://private 是类对象的默认访问控制,因此,可以省略 data member del ...
- 学习C++.Primer.Plus 8 函数探幽
1. 内联函数 普通函数调用: 存储调用指令的地址->将函数参数复制到堆栈->跳到函数地址执行代码(返回值放到寄存器)->跳回调用指令处 2. 当代码执行时间很短,且会被大量调用的 ...
- 学习C++.Primer.Plus 7 函数
C++的返回值类型不能是数组 函数原型中的变量名相当于点位符,因此不要求提供变量名. void cheers(int); C++中不指定参数列表时就使用活力号: void saybye(...); 通 ...
- 学习C++.Primer.Plus 6 分支语句和逻辑操作符
||. &&操作符是一个顺序点 < 操作符从左向右结合 ; < age < )//17<age为true, = 1,肯定 < 27.所以为整个条件为tru ...
- 学习C++.Primer.Plus 5 循环和关系表达式
C++将赋值表达式的值定义为左侧成员的值 赋值操作符是自右向左结合的 cout.setf(ios:: boolalpha);//调用设置标记,命令cout输出true或false,而非1或0. 任何表 ...
随机推荐
- elecworks无法连接至协同服务器
http://jingyan.baidu.com/article/597a0643759e1c312b524385.html 在安装路径中找到Server文件夹,在文件夹中你可以看到只有一个文件[Ew ...
- Lexicographical Numbers
Given an integer n, return 1 - n in lexicographical order. For example, given 13, return: [1,10,11,1 ...
- Python比较函数__cmp__
#!/usr/bin/python class my_type(object): def __init__(self, v): self.value = v def __cmp__(self, v2) ...
- Datatable的Select()方法简介
DataTable是我们在进行开发时经常用到的一个类,并且经常需要对DataTable中的数据进行筛选等操作,下面就介绍一下Datatable中经常用到的一个方法——Select,微软提供了四个函数的 ...
- C# Redis Server分布式缓存编程(二)
在Redis编程中, 实体和集合类型则更加有趣和实用 namespace Zeus.Cache.Redis.Demo { public class Person { public int Id { g ...
- hdu 5497 Inversion 树状数组 逆序对,单点修改
Inversion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5497 ...
- oracle数据库表空间及归档
--表空间(TableSpace)是Oracle的开创性理念.表空间使得数据库管理更加灵活,而且极大地提高了数据库性能. --作用 :1.避免磁盘空间突然耗竭的风险 2.规划数据更灵活 3.提高数据库 ...
- memset函数具体说明
1.void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c. 2.样例#include void main(){char ...
- C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决
近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...
- Ubuntu Linux下如何配置Android开发环境
下载和安装Win7系统Android开发环境中讲了怎样在Win7系统中安装Android开发环境,那么怎样在Linux系统中配置Android开发环境呢?本篇文章就将演示如何使用Eclipse.And ...