C++ Primer知识点学习(二)

第二部分
1、顺序容器
【顺序容器:】
vector:支持快速随机访问。但在容器的任意位置插入或删除元素,比在容器尾部插入和删除的开销更大。
list:支持快速插入/删除。随机访问开销较大
deque:双端队列。与vector类似,但支持在容器的首部快速插入新元素,而且无论在哪一端插入或删除都不会引起元素的重新定位。  

【容器的选择】
通常,除非找到选择使用其他容器的更好理由,否则vector容器都是最佳选择。

使用【vector<pair<float, float>> ,并配合sort()函数】可以实现键值对的存储排序。

【顺序容器适配器:
stack:后进先出(LIFO)栈     所关联的基础容器可以是任意一种顺序容器类型
queue:先进先出(FIFO)队列   要求其关联的基础容器必须提供push_front运算,因此只能建立在list容器上,而不能建立在vector容器上
priority_queue:有优先级管理的队列   允许用户为队列中存储的元素设置优先级,根据指定的优先级级别插入   要求提供随机访问功能,因此可以建立在vector或deque容器上,但不能建立在list容器上。
默认的stack和queue都基于deque容器实现,而priority_queue则在vector容器上实现。

适配器是使一事物的行为类似于另一事物的行为的一种机制。所有的适配器都会在其基础顺序容器上定义一个新的接口
相关头文件:stack、queue

将一个容器复制给另外一个容器时,类型必须匹配:容器和元素类型都必须相同。
使用迭代器时,不要求容器类型相同。容器内的元素也可以不同,只要能够互相兼容,能够将要复制的元素转换为所构建的新容器的元素类型,即可实现复制。迭代器标出要复制的第一个元素和最后一个元素。
容器元素类型必须满足以下两个约束:
1、元素类型必须支持赋值运算
2、元素类型的对象必须可以复制
IO库类型不支持复制或赋值。因此,不能创建存放IO类型对象的容器。
在指定容器元素为容器类型时,必须如下使用空格:vector < vector<string > > lines;

Tips
1、 迭代器运算(iter ± n、iter1 ±= iter2、iter1 - iter2)以及迭代器的关系操作符(>、>=、<、<=)只适用于 vector和deque迭代器
2、在容器中添加元素时,系统是将元素值 复制到容器里。
3、 任何insert或push操作都可能导致迭代器失效。当编写循环将元素插入到vector或deque容器中时,程序必须确保迭代器在每次循环后都得到更新。特别地,不要存储end操作返回的迭代器,添加或删除deque或vector容器内的元素都会导致存储的迭代器失效。
4、 c[n]和c.at(n) 只适用于vector和deque容器  【快速随机访问特征】
5 、swap操作不会删除或插入任何元素,而且保证在常量时间内实现交换。 迭代器不会失效,仍然指向同一元素,只是这些元素被存储在不同的容器之中。
6、vector容器的元素以连续方式存放, capacity()操作获取在容器需要分配更多的存储空间之前能够存储的元素总数。 reserve()操作告诉vector容器应预留多少个元素的存储空间。
7、string类型在使用只有一个指针参数的构造函数时,该指针指向 以空字符结束的字符数组中的一个元素。
begin:返回一个迭代器,指向容器的第一个元素
end:返回一个迭代器,指向容器最后一个元素的下一位置
back:返回容器的最后一个元素的引用
front:返回容器的第一个元素的引用

【string类型:字符容器】
只适用于string类型的操作
1、substr函数 //子串操作
2、append和replace函数//append函数指字符添加在string对象的末尾;replace函数将字符插入到指定位置,从而替换string对象中一段已存在的字符,等效于调用erase和insert函数。
3、一系列 find函数//find、rfind、find_first_of、find_last_of、find_first_not_of、find_last_not_of、
4、string对象的比较compare
5、assign、swap、insert、push_back、begin、end、下标等操作均适用

2、关联容器
//一个键对应一个元素
map:以键-值对的形式组织,元素通过键来存储和读取【 适用于需要存储或修改每个键所关联的值的情况
set:仅包含一个键,并有效地支持关于某个键是否存在的查询。大小可变的集合,支持通过键实现的快速读取。【 有效地存储不同值的集合
//一个键可以对应多个元素
multimap:支持同一个键多次出现的map类型
multiset:支持同一个键多次出现的set类型
【pair类型】
与容器一样,pair类型也是一种 模板类型。但与之前介绍的容器不同,在创建pair对象时,必须提供两个类型名。
pair类型使用相当繁琐,因此,如果需要定义多个相同的pair类型对象,可以考虑利用typedef简化其声明。
pair对象具有first、second两个公有成员。
对于map容器,value_type并非元素的类型,而是描述其关联值类型的pair类型。
pair类型在key(first)相等的情况下,比较两者的value(second)。

【map】
所有的比较函数必须在键类型上定义 严格弱排序,所谓的严格弱排序可理解为键类型数据上的“小于”关系。 对于键类型,唯一的约束就是必须支持<操作符,至于是否支持其它的关系或相等运算,则不作要求。【为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在插入<key, value>键值对时, 就会按照key的大小顺序进行存储。这也是作为key的类型必须能够进行<运算比较的原因】
【map<类型1,类型2,自定义比较函数>】
value_type是存储元素的键以及值的pair类型,而且键为const。对迭代器解引用时获得一个引用,指向容器中一个value_type类型的值,该值包含const key_type(键)和mapped_type(值)类型成员的pair对象。
用下标(键)访问map对象时,如果该键值不存在将导致在map容器中添加一个新的元素,它的键即为该下标值。该运算生成mapped_type类型的值。//【该特性可以用来统计字符串中出现字符的个数】
使用 make_pair或typedef简化实参传递。
如果试图插入的元素所对应的键已存在容器中,则insert将不做任何操作。
对于map对象,count成员的返回值只能是0或1,可以简单判断该值是否存在。因为map容器只允许一个键对应一个实例,所以count可有效地表明一个键是否存在。
【set】
键的集合。 不支持下标操作,没有mapped_type类型,value_type不是pair类型,而是与key_type相同的类型,也就是set中存储的元素类型。与map一样,其键必须唯一,并且不能修改。
set集合容器使用一种称为红黑树(Red-Black Tree) 的 平衡二叉检索树的数据结构,来组织泛化的元素数据。每个节点包含一个取值红色或黑色的颜色域,以利于进行树的平衡处理。作为节点键值的元素的插入,必须确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值。不会将重复的键值插入容器,也不需要指定具体的插入位置,而按元素在树中的关联关系,进行位置检索和插入,元素的删除亦然。
 元素数据的检索,使用的是二叉检索树的中序遍历算法,检索的效率高于vector、 deque和list等容器。由于采用中序遍历算法可将二叉检索树的键值,由小到大排列遍历出来,因此 set 集合容器蕴含了元素间的有序性


【multimap和multiset】
允许一个键对应多个实例。所支持的操作与map和set相同,但不能支持下标运算。
在multimap中,同一个键所关联的元素必然相邻存放。
查找元素:find和count操作; lower_bound(k)【返回键不小于k的第一个元素】和upper_bound(k) 【返回键大于k的第一个元素】【 该操作适用于所有关联容器,但更常用于multimap和multiset,若该键存在,则返回两个不同的迭代器,lower_bound返回的迭代器指向该键关联的第一个实例,而upper_bound返回的迭代器则指向最后一个实例的下一位置。若键不存在,则两者返回同一迭代器】。
equal_range(k)//返回一个迭代器的pair对象。first成员等价于lower_bound(k)返回的迭代器,second成员等价于up_bound(k)返回的迭代器

//*******************************************在基础知识中有容器与迭代器相关内容*******************************************************************

3、泛型算法
泛型:可以操作在多种容器类型上。 算法:实现共同的操作。
泛型算法本身从不执行容器操作,只是单独依赖迭代器和迭代器操作实现。
头文件:algorithm【泛型算法】、numeric【算术算法】
【只读算法】
find()
accumulate()//返回类型是第三个实参的类型
find_first_of()
【写容器元素的算法】
fill()
fill_n()
back_inserter()//迭代器适配器,头文件iterator,能在容器中添加一个新元素
copy()
replace()
replace_copy()
【排序算法】
去除重复
sort()//排序,针对序列容器。
unique()//“删除”相邻的重复运算。重新排列输入范围内的元素,并返回一个迭代器,表示无重复的值范围的结束。
erase()//删除容器项
stable_sort()//对于长度相同的元素,将保留其字典顺序。
count_if()//返回使谓词函数返回条件成立的元素个数。
set_intersection()//查找两个查询中的公共行

谓词:做某些检测的函数,返回用于条件判断的类型,指出条件是否成立。其返回类型可转换为bool值的函数
算法不直接修改容器的大小。如果需要添加或删除元素,则必须使用容器操作。

【插入迭代器】
与容器绑定在一起。
back_inserter:创建使用push_pack实现插入的迭代器。
front_inserter:使用push_front实现插入//vector没有push_front操作,所以不能使用front_inserter
inserter:使用insert实现插入操作,在所标明的位置前面插入新元素。
【iostream迭代器】
可以输入或输出流绑定在一起。
istream_iterator:可比较。
ostream_iterator:不可比较。一旦赋值,没有办法再改变这个值,每个不同的值都只能正好输出一次。没有->操作
【反向迭代器】
从最后一个到第一个元素遍历容器。rbegin()、rend()、reverse_iterator
流迭代器不能创建反向迭代器。
【const迭代器】
const_iterator:不希望使用该迭代器来修改容器中的元素。
【五种迭代器】
算法要求的迭代器操作分类:
1、输入迭代器
不能写,只支持自增运算。
2、输出迭代器
不能读,只支持自增运算。对于指定的迭代器值应该使用一次*运算,而且只能用一次。
3、前向迭代器
读和写,只支持自增运算。
4、双向迭代器
读和写,支持自增和自减运算。
5、随机访问迭代器
读和写,支持完整的迭代器算术运算。

map、set和list类型提供双向迭代器,而string、vector、deque容器上定义的迭代器都是随机访问迭代器,用作访问内置数组元素的指针也是随机访问迭代器。istream_iterator是输入迭代器。ostream_iterator是输出迭代器。 关联容器只能使用算法的一个子集,因为关联容器的键是const对象。因而不能使用任何写序列元素的算法。

【泛型算法的结构】
根据对元素的操作将算法分为:
1、只读算法,不改变元素的值和顺序
2、给指定元素赋新值的算法
3、将一个元素的值移给另一个元素的算法
【算法所带的形参定义的算法模式】
alg(beg,end,other parms);
alg(beg,end,dest,other parms);//带有单个目标迭代器,通常配合使用插入迭代器或者ostream_iterator,防止出现输出容量不足问题。
alg(beg,end,beg2,other parms);//与写入dest的算法一样,只带有beg2的算法也假定以beg2开始的序列与beg和end标记的序列一样大。
alg(beg,end,beg2,end2,other parms);//指定第二个输入范围
【通过两种函数命名和重载的规范定义的算法模式】
1、测试输入范围内元素的算法
这些算法通常用到标准关系操作符:==或<,其中大部分允许程序员提供比较或测试函数取代操作符的使用,即使用谓词函数作为额外的参数
带有 谓词函数形参的算法,其名字带有 后缀_if,防止重载版本可能导致的二义性,以及可使得元素采取不同操作符运算
2、应用于对输入范围内元素重新排序的算法
标准库可提供将重新排列输入范围的元素写到指定的输出目标。此版本的算法在名字中添加了 _copy后缀。将修改过的元素写到输出序列,而不是写回输入范围。
【容器特有的算法】
list容器特有的操作。对于list对象,应该首先使用list容器
特有的成员版本,而不是泛型算法。
remove和unique的list版本修改了其关联的基础容器,真正删除了指定的元素。
merge和splice运算会破坏它们的实参。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值