点击查看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_typevalue_type是一致的。在map中,value_typepair类型的,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

三、关联容器迭代器

mapvalue_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));

mapinsert的返回值是个pair类型,first代表迭代器,secondbool类型,表示是否插入成功,成功返回true

//返回值是个pair类型
pair< map<string, size_t>::iterator, bool> ret = word_cout.insert({word, 1});
cout<< ret.first->second << endl;

multimapinsert只会返回迭代器,因为它的插入总是成功的。

五、删除元素

三种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查找元素个数。

multimapmultiset中查找元素。

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_boundupper_bound,返回一个pair,firstlower_bound的结果,secondupper_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_setunordered_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的更多相关文章

  1. 学习C++ Primer 的个人理解(一)

    <C++ Primer>这本书可以说是公认的学习C++最好的书,但我觉得不是特别适合作为教材,书中内容的顺序让人有些蛋疼.我个人认为初学此书是不能跳着看的.如果急于上手的话,我更推荐< ...

  2. 学习C++ Primer 的个人理解(九)

    这一章介绍顺序容器,在之前的第三章中,了解到的vector就属于顺序容器的一种. 一个容器就是一些特定类型对象的集合. 除了vector,还有哪些顺序容器? vector: 大小可变,随机访问的速度很 ...

  3. 学习C++ Primer 的个人理解(三)

    第三章,主要内容是字符串和数组.感觉作者的意图是希望读者可以早一点可以写出简单的小程序,并且可以早点接触迭代器这种思想. 在我看来,这种内容的难度并不大. 对于编程来说,最重要的应该是思想,类似vec ...

  4. 学习C++ Primer 的个人理解(二)

    本身就一定基础的读者我想变量常量这些概念应该已经不是问题了.但是本章还是有几个重点,需要特别留意一下的: 1.初始化和赋值是不同的操作 2.任何非0值都是true 3.使用新标准列表初始化,在有丢失精 ...

  5. 学习C++.Primer.Plus 11 使用类

    1.操作符重载 重载操作符的几个限制: a)         重载的至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载操作符. b)         不能违反操作符原有来的句法规则. c)  ...

  6. 学习C++.Primer.Plus 10 对象和类

    1.类的声明和定义 类的声明和定义. 类声明的格式如下: class className { private://private 是类对象的默认访问控制,因此,可以省略 data member del ...

  7. 学习C++.Primer.Plus 8 函数探幽

    1. 内联函数 普通函数调用: 存储调用指令的地址->将函数参数复制到堆栈->跳到函数地址执行代码(返回值放到寄存器)->跳回调用指令处 2.  当代码执行时间很短,且会被大量调用的 ...

  8. 学习C++.Primer.Plus 7 函数

    C++的返回值类型不能是数组 函数原型中的变量名相当于点位符,因此不要求提供变量名. void cheers(int); C++中不指定参数列表时就使用活力号: void saybye(...); 通 ...

  9. 学习C++.Primer.Plus 6 分支语句和逻辑操作符

    ||. &&操作符是一个顺序点 < 操作符从左向右结合 ; < age < )//17<age为true, = 1,肯定 < 27.所以为整个条件为tru ...

  10. 学习C++.Primer.Plus 5 循环和关系表达式

    C++将赋值表达式的值定义为左侧成员的值 赋值操作符是自右向左结合的 cout.setf(ios:: boolalpha);//调用设置标记,命令cout输出true或false,而非1或0. 任何表 ...

随机推荐

  1. python 定义函数

    在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...

  2. 转载 SharePoint 2013 Search功能

    转载原出处: http://www.cnblogs.com/OceanEyes/p/SharePont-2013-Search-Develop.html 阅读目录 启用Search Service A ...

  3. ASP.NET- 查找Repeater控件中嵌套的控件

    如何在Repeater的HeaderTemplate和FooterTemplate模板中寻找控件?在Repeater的ItemTemplate模板中的控件,我们可以用Items属性来遍历行并用Find ...

  4. 学习和理解C#的委托

    去年自学C#用的教程是入门级的<学通C#的24堂课>,教材里面也没有提到委托和事件,工作中也没怎么用到.后来一次在网上看了一些大牛的博客,读完之后感觉懵懵懂懂,似懂非懂,过了两三天之后,却 ...

  5. Android设计模式系列--工厂方法模式

    工厂方法模式,往往是设计模式初学者入门的模式,的确,有人称之为最为典型最具启发效果的模式.android中用到了太多的工厂类,其中有用工厂方法模式的,当然也有很多工厂并不是使用工厂方法模式的,只是工具 ...

  6. Windows ICS 服务无法启动问题解决

    防火墙打不开肯定是"windows Firewall"服务没有启动.ICS服务启动不了能够通过下面方法解决: 1.找到本地连接,单击左键--属性--共享--勾选(√)--确定,如以 ...

  7. [MODx] 9. Real Example

    Snippet code: <?php $path = MODX_CORE_PATH . 'components/storefinder/'; $result = $modx->addPa ...

  8. 会话跟踪session cookie

    会话跟踪 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在 ...

  9. [原创]如何写好SqlHelper

    所有写数据库应用的都会遇到SqlHelper.每个人实现的也不同,网上现成的例子也很多.但在实际操作中,大部分都不实用.什么样的才是实用的?答:适合应用场景的! 下面来介绍下我写的一个关于Oracle ...

  10. 学习笔记之Python

    http://baike.baidu.com/view/21087.htm?fr=aladdin#reference-[12]-21087-wrap Python 基础教程(http://www.w3 ...