`

标准数组--向量(2)

阅读更多

 

另外一种遍历方法是使用迭代器对iterator pair 来标记向量的起始处和结束处。迭代

器是一个支持指针类型抽象的类对象。vector 类模板提供了一对操作begin()和end(), 它们分

别返回指向向量开始处和结束处后1 个的迭代器,这一对迭代器合起来可以标记出

待遍历元素的范围。例如。下面的代码是前面代码段的一个等价实现

#include < vector >

extern int getSize();

void mumble()

{

int size = getSize();

vector< int > vec( size );

vector< int >::iterator iter = vec.begin();

for ( int ix = 0; iter != vec.end(); ++iter, ++ix )

*iter = ix;

// ...

}

iter 的定义

vector< int >::iterator iter = vec.begin();

将其初始值指向vec 的第一个元素,iterator 是vector 类模板中用typedef 定义的类型。

而这里的vector 类实例包含int 类型的元素。下面的代码使迭代器指向vector 的下一个元

素++iter

下面的代码解除迭代器的引用,以便访问实际的元素

*iter

能够应用到向量上的操作惊人地多。但是它们并不是作为vector 类模板的成员函数提供

的。它们是以一个独立的泛型算法集的形式,由标准库提供下面是一组可供使用的泛型算

法的示例。

搜索search 算法find()、 find_if()、search()、binary_search()、count()和count_if()。

分类排序sorting 与通用排序ordering 算法sort()、 partial_sort() 、merge()、

partition() rotate() reverse()和random_shuffle()。

删除deletion 算法unique()和remove()

算术numeric 算法accumulate()、partial_sum()、inner_product()和adjacent_

difference()。

生成generation 和变异mutation 算法generate()、fill()、transformation()

copy()和for_each()

关系Relational 算法equal()、min()和max()

泛型算法接受一对迭代器,它们标记了要遍历元素的范围。例如ivec 是一个包含某

种类型元素的某个长度的向量,要用sort()对它的全部元素进行排序,我们只需简单地这

样写:

sort( ivec.begin(), ivec.end() );

只想对ivec 向量的前面一半进行排序,可以这样写

sort( ivec.begin(), ivec.begin()+ivec.size()/2 );

泛型算法还能接受指向内置数组的指针对,例如已知数组

int ia[7] = { 10, 7, 9, 5, 3, 7, 1 };

我们可以如下对整个数组排序

sort( ia, ia+7 );

我们还可以只对前四个元素排序

sort( ia, ia+4 );

要使用这些算法我们必须包含与它们相关的头文件

#include <algorithm>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics