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运算符进行排列.