`
fuerbosi
  • 浏览: 461130 次
文章分类
社区版块
存档分类
最新评论

暑假c++复习9之泛型算法

 
阅读更多

由于find运算时基于迭代器的,因此可在任意的容器中使用像同的覅俺的函数

例如:vector<int >::iterator result=find(vec.begin,vec.end,search_value)

list<int >::iterator result=find(lst.begin,lst.end,search_value);

由于指针的行为与作用在啊内置数组上的迭代器一样,因此也可以使用find来搜索数组:

int ia[5]={1,3,4,5,6};

int search=5;

int *result=find(ia,ia+5,search_value);

算法是如何工作的:

每个泛型算法的实现都独立于单独的容器,从概念上看find函数必须包含以下步骤:

1)顺序检查每个元素,

2)如果当前的元素等于要查找的值,那么返回只想该元素的迭代器。

3)否则,检查下一个元素,重复步骤2,直到找到这个值,或检查完所有的元素为止。

4)如果已经到达集合末尾,而且还未找到该值则返回某个值,知名要查找的值不在集合中。

使用泛型算法必须包含头文件algorithm头文件。

标准库还定义了一组泛化的算术算法,其命名习惯于泛型算法形同,使用这些算法必须包含numric头文件。

除了少数例外,所有算法都在一段范围内的元素上操作,我们将这段范围陈伟“输入范围”,带有输入范围参数的算法,总是使用头两个形参标记该范围,

1.。只读算法:

除了find之外,另一个简单的只读算法是accumulate,该算法在numeric头文件中定义。

int sum=accumulate(vec.begin().vec.end(),42);

accumulate第三个参数是累加的初值,该函数将它的一个内部变量设置为指定的初值,然后在此基础上累加输入范围内所有元素的值,accumulate算法返回累加的结果,其返回类型就是其第三个实参的类型。

考虑下面的例子,可以使用accumulate吧string类型的vector容器中的元素连接起来

string sum=accumulate(vec.begin().vec.end(),string(""));

注意:程序显式的创建一个string对象,用作该函数调用的第三个实参,传递一个字符串字面值,将会导致变异是错误,因为此时累加和的类型将是const char*。而string的加法操作符,所使用的主要做数则分别是string和const char*类型、

令:find_fist_of

2.。写容器元素的算法。

写入到输入序列的一个简单算法是fill算法

fill(vec.begin().vec.end());//重设每一个元素为0;

fill(vec.begin(),vec.begin()+vec.size()/2,10);//

执行时,将该范围内的每个元素都设为给定的值。

另外一个函数是:

fill_n(iterator,n,value);

该函数从迭代器指向的元素开始,将制定数量的元素设置为给定的值,初学者常犯的错误是:在没有元素的空容器上调用fill_n函数。

vevtor vec;

fil_n(vec.begin(),10,9);//灾难性错误,vec是空容器,却要求往里面写10个9;从bigin开始写。

引入back_inserter

vector<int>vec;

fill_n(back_inserter(vec),10,9);

现在fill_n函数每写入一个值,都会通过back_inserter生成的插入迭代器实现,效果相当于在vec上调用push_back ,在vec末尾添加10个元素,每个元素都是9.


写入到目标迭代器的算法;

第三类算法是想目标迭代器写入未知个数的元素。这类算法最简单的是copy函数

vector<int>ivec;

copy(ilst.begin(),ilist.end(),back_inserter(vec));

从输入范围中读取元素,然后将他们复制给目标ivec;

当然这个例子的效率比较差。通常如果要以一个已存在的容器为副本创建新容器,更好的方法是直接用输入范围作为新构造容器的初始值。

vector<int> ivec(ilst.begin(),ilst.end());


replace(ilst.begin(),ilst.end(),0,42);//调用将所有为0 的实例替换成42

replace_copy(ilst.begin(),ilst.end(),back_inserter(ivec),0,42)//调用该函数后,ilst没有改变,ivec存储ilst的一个副本,而ilst内所有的0 在vec中都变成了42;

注意这俩个函数的区别


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics