第3章 泛型编程风格
Standard Template Library(STL)主要由两种组件构成:一是容器,包括vector、List、set、map等,另一种是操作这些容器的泛型算法(generic algorithm),包括find()、sort()、replace()等。
vector和list是顺序性容器,主要进行迭代操作。
map和set属于关联容器,可以用来快速查找容器中的元素值。
map是一对对的key/value组合。
set只有key。
泛型算法通过function template 技术,达到’与操作对象的类型相互独立’的目的。
3.1 指针的算术运算
3.2 了解Iterator(泛型指针)
3.3所有容器的共通操作:
1、 == 和 !=
2、 =
3、empty() \\容器为空时返回true
4、size() \\ 容器内的元素个数
5、clear() \\ 清空容器
每个容器都提供了begin()和end()函数,指向元素的第一个元素和最后一个元素下一位置的iterator;
insert() 插入一个或一个范围的的元素
erase() 删除某个或某个范围的元素
3.4 使用顺序性容器
使用顺序性容器,首先要包含相应的头文件:
#include<vector>
#include<list>
#include<deque>
产生顺序性容器的方式有五种:
1、产生空的容器
list<string> slist;
vector<int> ivec;
2.产生特定大小的容器, 其中元素以默认值作为初值
list<int> ilist(1024);
vector<string> svec(32);
3、产生特定大小的容器,且为每个元素指定初值
vector<int> ivec(10,-1);
4、通过一对iterator产生容器
int ia[8] = {1,1,2,3,4,5,8,13,21};
vector<int> fib(ia,ia+8);
5、根据某个容器产生
list<string> slist;
//填充slist
list<string> slist2(slist);//将slist复制给slist2
在容器末尾插入:push_back()
在容器某位删除:pop_back()
front()读取最前的值
back()返回最末尾的值
3.5 使用泛型算法
首先包含头文件
#include<algorithm>
四个泛型搜索算法:
find():搜索无序集合中是否包含某值
binary_search() 二分搜索,用于有序集合的搜索。
count() 返回数值相符的元素个数。
search() 查找某个容器内是否存在某个子序列。如果有,则返回指向子序列起始处的itrator, 否则返回容器末尾。
3.6 如何设计一个泛型算法
Function Object
所谓function object,是某种class的实例对象,这类对象对function call运算符做了重载操作,如此一来就可以使function object 当成一般函数来使用。
function object adapter会对function object 进行修改操作。所谓bind adapter会将function object 的参数绑定至特定值。
3.7 使用Map
map被定义为一对数值。
建立map:
#include<map>
#include<string>
map<string,key> words;
输入key/value对:
words[“Vermeer”] = 1;
first,second: map对象的两个成员,first对应key,second对应value。
查询某个key是否在map中:
words.find(“Vermeer”); 如果在,则返回一个iterator,指向key/value的一个pair
否则返回end();
it = words.find(“Vermeer”);
if(it!=words.end())
count = it->second;
3.8 使用Set
Set是一群key组合而成的。
#include<set>
#include<string>
set<string>word_exclusion;
对于任何key,set只存一份。
为set加入元素
iset.insert(ival);
iset.insert(ver.begin().ver.end());
3.9 如何使用Iterator Inserter
3.10 使用iostream iterator