C++Primer 第十一章

//1.关键容器支持高校的关键字查找和访问。
map                 关联数组:保存关键字-值对。通过关键字来查找值。
set                 关键字即值,即只保存关键字的容器。
multimap            关键字可重复出现的map
multiset            关键字可重复出现的set
//尚不研究无序关联容器
unordered_map       用哈希函数组织的map
unordered_set       用哈希函数组织的set
unordered_multimap  用哈希函数组织的map,关键字可重复出现
unordered_multiset  用哈希函数组织的set,关键字可以重复出现
//  multiply  [‘mul·tiply || ‘m?t?pla?]v.  乘
//  当初始化一个map的时候,必须提供关键字类型和值类型。
//  对于有序关联容器关键字类型必须定义元素比较的方法。有序关联容器都是默认按照<进行排序。
//  有multi前缀的关联容器的关键字是可以重复的,否则此关联容器的关键字都是不能重复的
//  不能改变关联容器的关键字部分,这就推出set系列的关联容器的元素不能被改变,map系列的关联容器的元素的first成员不能被改变。
//  关联容器默认使用关键字的<操作来比较关键字。

//2.关联容器的迭代器都是双向迭代器,不支持随机访问,这就意味着关联容器的迭代器不支持 += -= 等操作(包括map和unordered_map),除了map和unordered_map以外的关联容器也不能支持下标运算符操作。

//3.pair:定义在头文件utility中,当创建一个pair的时候必须提供两个类型名。
//  pair定义的操作:
//     A:make_pair:定义在命名空间std中,返回一个用传入值初始化(构造)的pair。
//     B:first:返回pair中名为first的数据成员。
//     C:second:返回pair中名为second的数据成员。
//     == != :当first和second成员均相等的时候,两个pair相等。相等性由元素的==运算符判断。
//  utility  [u·til·i·ty || ju?‘t?l?t?]n. 公用程序

//4.关联容器的额外类型别名:(关联容器含有顺序容器中定义的类型别名)
//  key_type:此容类型的关键字类型
//  mapped_type:每个关键字关联的类型,只适用于map系列的关键容器
//  value_type:对于set系列的关键容器,与key_type相同,对于map系列的关键容器,为pair<const key_type, mapped_type>

//5.当解引用关联容器的迭代器的时候,会得到一个类型为容器的value_type的值的引用。

//6.由于关联容器的读写限制,和其迭代器不支持随机访问,所以一般不对关联容器使用泛型算法,而是使用其本身的算法。
//  若是对关联容器使用泛型算法,也一般将其当做源序列或者是目的位置。

//7.对关联容器添加元素:使用insert和emplace
map<string, int> StrInt;
StrInt.insert(make_pair("1", 1));
StrInt.insert(make_pair("0", 0));
StrInt.insert(make_pair("3", 3));
//insert在插入单一元素的时候返回一个pair,其first成员是插入的元素,其second成员是插入的结果,成功为true,失败为false
//insert插入的时候,可以指定从哪里开始搜索插入的位置,对插入结果没有影响,应该会影响插入的效率
auto temValue = StrInt.insert(StrInt.begin(), make_pair("2", 2));
//StrInt = [4](("0", 0),("1", 1),("2", 2),("3", 3))
//temValue = (("2", 2), true)

map<string, int> StrInt1;
//insert在插入一个序列的时候,返回void
StrInt1.insert(StrInt.begin(), StrInt.end());
//StrInt1 = [4](("0", 0),("1", 1),("2", 2),("3", 3))

map<string, unique_ptr<char[]>> StrChar;
StrChar.emplace(make_pair("1", new char[1]));
//insert是按值插入,emplace是构造插入

//8.关联容器删除元素:
map<string, int> StrInt;
StrInt.insert(make_pair("1", 1));
StrInt.insert(make_pair("0", 0));
StrInt.insert(make_pair("3", 3));
StrInt.insert(StrInt.end(), make_pair("2", 2));                    //StrInt = [4](("0", 0),("1", 1),("2", 2),("3", 3))
map<string, int>::size_type value = StrInt.erase(string("0"));     //value = 1 StrInt = [3](("1", 1),("2", 2),("3", 3))
//erase:第一个版本,删除关联容器中每个关键字为传入参数的元素,返回删除元素的数量

StrInt.erase(StrInt.begin());                                      //StrInt = [2](("2", 2),("3", 3))
//erase:第二个版本,删除关联容器中指定迭代器所指的元素

StrInt.erase(StrInt.begin(), StrInt.end());                        //StrInt = [0]()
//erase:第三个版本,删除关联容器中指定迭代器序列所指的元素

//9.map和unordered_map容器提供了下标运算符和at()成员函数,通过传入关键字来得到与关键字绑定的值。注意点:当关键字不在指定的容器中的时候,下标运算符会为其创建一个值初始化的值与关键字绑定并插入指定容器,而使用at()的时候则会报out_of_range的错误。
//  由于下标运算符可能插入一个新元素,所以只能对非const的map或者unordered_map进行下标操作。
//  通常情况下,一个容器的下标的返回值和其迭代器解引用的返回值的类型是一致的,但是对于map和unordered_map来说,下标运算符返回类型是mapped_type,解引用迭代器返回类型是value_type
//  此处的下标运算符返回的是左值,所以可以读写元素。

//10.关联容器中的查找操作:
c.find(k):返回一个迭代器,指向第一个关键字为k的元素,若k不在容器中,则返回尾后迭代器
c.count(k):返回关键字等于k的元素的数量。
c.lower_bound(k):返回一个迭代器,指向第一个关键字不小于k的元素。换句话说,此函数返回的迭代器指向第一个具有给定关键字的元素。
c.upper_bound(k):返回一个迭代器,指向第一个关键字大于k的元素。换句话说,此函数返回的迭代器指向最后一个匹配给定关键字的元素之后的元素。
c.equal_range(k):返回一个迭代器pair,若关键字存在,则第一个迭代器指向第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。若未找到元素,则两个迭代器都指向关键字可以插入的位置。
//当给定的关键字不在序列中的时候,lower_bound和upper_bound返回值相同,返回关键字的第一个安全插入点,即不影响容器中元素顺序的插入位置。

//11.关联容器支持通过关键字查找和提取元素。对关键字的使用将关联容器和顺序容器区分开,顺序容器是通过位置访问元素。
时间: 2024-10-24 13:02:57

C++Primer 第十一章的相关文章

C++primer第十一章 泛型算法

标准库容器定义的操作非常少.标准库没有给容器添加大量的功能函数,而是选择提供一组算法,这些算法大都不依赖特定的容器类型,是“泛型”的,可作用在不同类型的容器和不同类型的元素上. 因为它们实现共同的操作,所以称之为“算法”:而“泛型”指的是它们可以操作在多种容器类型上——不但可作用于 vector 或 list 这些标准库类型,还可用在内置数组类型.甚至其他类型的序列上. 11.1. 概述 假设有一个 int 的 vector 对象,名为 vec,我们想知道其中包含某个特定值.解决这个问题最简单的

C++ primer 第十一章笔记之 关联容器

按关键字有序保存元素 map 关联数组:保存关键字-值对应 头文件map set 关键字既值,既只保存关键字的容器 头文件set multimap 关键字可重复出现的map 头文件map multiset 关键字可重复出现的set 头文件set 无序集合 unordered_map 用hash函数组织的map 头文件unordered_map unordered_set 用hash函数组织的set 头文件unordered_set unordered_multimap hash组织的map:关键

第十一章 泛型算法 C++ PRIMER

vector<int>::const_iterator result = find(vector.begin(). vector.end(),search_value); 如果查找失败,分会end()  如果有两个,会返回哪一个的迭代器? int *reauslt = find(ia,ia+6,search_value); 也可以同样处理字符串 算法要以<algorithm><numeric>,依赖于迭代器和迭代器的算法实现,算法可能改变值,可能移动元素,单从不直接添加

C Primer Plus 第十一章 习题总结……2015.5.10

C Primer Plus         第五版 第十一章  字符串和字符串函数 1.没有加上字符串结尾标志 空字符'\0': 2.#include<stdio.h> int main(void) { char note[]="See you at snack bar: "; char *ptr; ptr=note; puts(ptr); puts(++ptr); note[7]='\0'; puts(note); puts(++ptr); return 0; } 3.#

c++ primer 5th 笔记:第十一章

第十一章:关联容器 笔记 1. 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的.与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的. 2. 关联容器支持高效的关键字查找和访问,两个主要的关联容器类型是map和set.map中的元素是一些关键字-值对:关键字起到索引的作用,值则表示与索引相关联的数据.set中每个元素只包含一个关键字:set支持高效的关键字查询操作--检查一个给定关键字是否在set中. 3. 当从map中提取一个元素时,会得到一个pair

C Primer Plus (第五版) 第十一章 字符串和字符串函数 编程练习

第十一章 字符串和字符串函数 编程练习 设计并测试一个函数,可以输入读取n个字符(包括空格.制表符.换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递. #include <stdio.h> #define LEN 80 char * getch(char a[], int n); int main(void) { char a[LEN]; if (getch(a, 4)) puts(a); else printf("没有读取\n"); return 0; }

javascript高级程序设计 第十一章--DOM扩展

javascript高级程序设计 第十一章--DOM扩展DOM最主要的扩展就是选择符API.HTML5和Element Traversal Selectors API:定义了两个方法 querySelector() 和 querySelectorAll(),能够基于CSS选择符从DOM中取得元素.querySelector()方法接收一个CSS选择符,返回该模式匹配的第一个元素,querySelectorAll()接收的参数一样,但是返回NodeList实例: matchesSelector()

zabbix专题:第十一章 zabbix proxy分布式监控配置

zabbix专题:第十一章 zabbix proxy分布式监控配置             对Linux有兴趣的朋友加入QQ群:476794643 在线交流 本文防盗链:http://zhang789.blog.51cto.co zabbix proxy分布式监控配置 zabbix proxy可以代替zabbix server检索客户端的数据,然后把数据汇报给zabbix server,并且在一定程度上分担了zabbix server的压力.zabbix proxy可以非常简便的实现了集中式.分

第十一章 执行查询算法

第十一章      执行查询算法 基本概念: 三类查找方法:线性查找.树形查找.哈希表查找 动态查找表:在查找的同时,对表做修改操作(如插入和删除),则相应的表称为动态查找表 静态查找表:与动态查找表相反 查找过程中对关键字需要执行的平均比较次数(也称平均比较长度作为衡量一个查找算法优劣的标准 平均比较长度: 其中:n是结点的个数:pi是查找第i个结点的概率.若不特别申明,认为每个结点的查找概率相等,都为1/n:ci是找到第i个结点所需进行的比较次数. 线性查找: 基本思想:从表的一端开始,顺序