Essential C++ 学习笔记(三)

本文深入探讨了C++标准库中的容器特性,包括vector、list、deque等序列式容器的特点与应用场景,并详细介绍了泛型算法如find、binary_search、copy等的功能与使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Generic Programming

3.1 指针的算术运算

array 不会以传值方式复制, 但数组被传给函数,或是由函数中返回时,仅有第一个元素的地址会被传递.

vectoe可以是空的,array则否.

3.3 所有容器的共通操作

end()返回一个iterator, 指向容器的最后一个元素的下一个位置.

3.4 使用序列式容器

1. vector以一块连续的内存存放元素. 对vector进行随机存取,颇有效率. 如果将元素安插至任意位置,而此位置不是vector的尾端,效率就很低,

同样,删除vector内最后一个元素意外的任意元素同样缺乏效率.

list以双向链接来存储内容, 每一个元素都包含3个字段:value, back指针(指向前一个元素), front指针(指向下一个元素). 在list的任意位置进行

元素的安插或删除操作,都颇具效率,但是对list进行随机存取操作,效果不彰.

deque的行为和vector颇为相似. deque对于最前端和最后段元素的安插和删除操作效率更高.

2. iterator insert(iterator position, elemType value) 可将value安插于position之前.

3. erase() 函数返回的iterator, 皆指向被删除的最后一个元素的下一个位置

4. list不支持iterator的偏移运算

slist.erase(it1,it1+num_tries);

必须将it1和it2传入erase().


3.5 使用泛型算法

1. 泛型搜寻算法

find() 如果找到目标, 会返回一个iterator指向该值, 否则返回一个iterator指向last.

binary_search() 用于sorted集合的搜寻. binary_search比linear search更有效率.

search() 比较某个容器内是否存在某个序列.如果搜寻到子序列, 返回一个iterator指向子序列起始处. 如果不存在, 返回一个iterator指向last.

2. copy() 接受两个Itertors表示出复制范围, 第3个Iterator指向复制的目的地第一个元素. 确保目标容器有足够空间, 是程序员的责任.如果我们

不确定, 可以使用所谓的inserter, 以insertion模式取代默认的assignment.

back_inserter() 会以容器的push_back()取代assignment. 对于vector来说, 这是比较适合的inserter.

inserter() 会以容器的insert函数取代assigment. 接受两个参数,一个是容器,一个是指向容器内安插操作起始点的iterator.

front_inserter() 会以容器push_front() 取代assignment, 这个inserter 只适用于list和deque.

array并不支持元素安插操作.

3.6 如何设计一个泛型算法

function objects

可以令call运算符成为inline, 因而消除"通过函数指针来调用函数"时需付出的额外代价. 分为算术运算(arithmetic), 关系(relational), 逻辑运算(logical).

function object adapters

function object期待外界传入两个值, 每个元素都必须和用户所指定的数值进行比较. 我们需要做的就是将object转化为一个一元(unary)运算符, 这可通过

"将其第二个参数绑定(bind)至用户指定数值". STL提供了两个binder adapter: bind1st绑定至第一个操作数, bind2nd绑定至第二个.

3.7 使用Map

map对象有一个名为first的member, 对应于key, 另一个名为second的member, 对应于value.

任何一个key值在map内最多只有一份.

3.8 使用Set

默认情形下, set皆依据其所属型别默认的less-than运算符进行排列.

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值