Essential C++ 第三章 范型编程风格
3.1 指针的算术运算
假设我们需要完成以下工作。写一个函数可以同时处理vector
和array
内的任意类型元素。
1 |
|
3.2 了解Iterator(范型指针)
1 | for(iter = svec.begin(); iter != svec.end(); ++iter) |
vector<string>::iterator iter = sevc.begin()
此处iter
被定义为一个iterator
,指向一个vector
,后者的元素类型为string
。其初值指向
svec 的第一个元素。
3.3 所有容器的共通操作
- equality(==) 和inequality(!=)
- assignment(=),将某个容器复制给另一个容器
- empty()会在容器无任何元素时返回 true,否则返回 false
- size() 返回容器内目前持有的元素个数
- clear() 删除所有元素
3.4 使用顺序性容器
顺序性容器用来维护一组排列有序,类型相同的元素。vector
和list
是两个最组要的顺序性容器。
vector
以一块连续的内存来存放元素,可以进行随机访问,但是插入效率低。
list
以双向链接来存储内容,因此可以执行前进或后退操作。list
的每个元素都包含三个字段:value
,back
指针(指向前一个元素),front
指针(指向下一个元素),所以list
插入,删除效率高,随机访问效率低。
第三种顺序性容器是deque
,deque
也是以连续内存存储元素。和vector
不同的是,deque
对于前端元素的插入和删除操作,效率更高;末端亦同。如果我们需要在容器最前端插入元素,并执行末端删除操作,那么deque
便很理想。
3.5 使用范型算法
引入头文件
1 |
- find()
用于搜索无序集合中是否存在某值。如果找到,则返回一个
iterator
指向该值,否则返回一个iterator
指向 last - binary_search() 用于有序集合的搜索。如果找到目标,就返回 true,否则 false
- count() 返回数值相符的元素数目
- search()
对比某个容器内是否存在某个子序列。例如{1,3,5,7,2,9},如果搜索子序列{5,7,2},则search()会返回一个
iterator
指向子序列的起始处,如果子序列不存在,就返回一个iterator
指向容器末端。
3.6 如何设计一个范型算法
3.7 使用map
map 被定义为一对(pair)数值。
3.8 使用set
如果想知道某值是否在某个集合中,就可以用set
,不统计出现的次数。