算法的一些通用特征:
STL文档使用模板参数名称来表示参数模型的概念.比如下面的copy()原型:
所以标识符InputIterator和OutputIterator都是模板参数,看名字一眼就能看出来区间参数必须是输入迭代器或更高级的,而只是结果存储的迭代器必须是输出迭代器或更高级的.
STL的有些算法有两个版本: 就地算法(in-place algorithm)和复制算法(copying algorithm),顾名思义,sort()就是就地算法的例子:函数完成时,结果被存放在原始数据的位置上; 而copy()函数将结果发送到另一个位置,所以他是复制算法;STL对此的约定是,复制版本的名称将以_copy
结尾.
比如replace()函数,他将所有的old_value替换为new_value,则它的复制版本为:
对于复制算法的约定是: 返回一个迭代器,指向复制的超尾(最后一个值后面)的位置
另一个常见变体是: 有些函数是根据函数应用于容器元素得到的结果来执行操作的.他们通常以_if结尾,比如replace_if:
一个使用STL的例子:
假设编写一个程序,让用户输入单次,希望最后得到一个按照输入顺序排列的单次列表,一个按照字母排序的列表(忽略大小写),并记录每个单次被输入的次数(不考虑标点,数字,符号):
输入和保存我们可以用vector<>:
|
|
然后我们可以创建一个set
其他库
slice类对象可用作数组索引,他们表示的是不是一个值而是一组值.slice对象被初始化为三个整数值: 起始索引,索引数,跨距.起始索引是第一个被选中的元素的索引,索引数指出要选择多少个元素,跨距表示元素之间的距离.例: slice(1,4,3)创建的对象表示选择四个元素,他们的索引分别是1,4,7,10;从索引开始加上跨距得到下一个元素的索引.
把第1,4,7,10元素设为10:
一个valarrat和slice混用的例子:
模板initializer_list(C++11)
模板initializerlist(在头文件initializer中)是C++11新增的,可以使用初始化列表语法将STL容器初始化为一系列值:
这么做可行是因为容器包含了将initializer_list
这是C++11新增的通用初始化语法,可以使用{}而不是()来调用构造函数,并且在类有接受initializer_list作为参数的构造函数则将优先使用:
所有initializer_list元素的类型都必须相同,但编译器有的时候将尽心必要转换:
initializer_list使用例子,另外他还包含成员函数begin() end() size():
可以按值传递initializer_list对象,也可以按引用传递;STL是按值传递;