第十章:初识泛型算法

1,定义:标准库容器的操作集合很小,所以标准库定义了一组算法,这些算法可以在任何容器内使用,成为泛型算法。

概述:大多数算法都定义在algorithm头文件Numeric头文件

这些算法不会改变容器的大小,只是对里面的元素进行了改变,整个大小容量不会改变。

2,下面介绍一些常见的读容器的算法:

find算法,定义一个Int的vector容器,希望知道vector中是否包含一个特定值,我们调用find算法,它接受三个参数,前两个参数是表示范围的迭代器,第三个参数是要寻找的值格式为find(word.cbegin(),word.cend(),x);如果搜索失败则返回第二个参数,否则返回第一个等于给定值的迭代器

②accumulate算法接受三个参数,前两个指出了需要求和的元素范围(跟上一个函数一样),第三个参数是和的初值(注意这个初值一般是0)。还有一个需要注意的点,就是第三个参数必须与容器里面的元素相对应,即里面是字符串,第三个参数也是字符串,是整数,参数也是整数。

③equal算法接受三个参数,用于确定两个序列是否保存相同的值,它将第一个序列的对应元素与第二个序列的对应元素相比较,相等返回true,不相等返回false,可以用来不同的容器的不同值,它的格式为:equal(word1.cbegin(),word1.cend(),word2.cbegin()。但是有一个需要注意的前提,这两个序列一定要一样长。

3,下面介绍一下写容器的算法(将新值赋值给序列中的元素

,但是前提是容器要有空余来写入元素)

find算法接受三个参数,接受一对迭代器表示一个范围,还接受一个值作为第三个参数,算法将第三个参数赋值给在这个范围的每个元素,格式为fill(vec.begin(),vec.end(),0)。

fill_n算法接受一个的单迭代器,一个计数值,和一个值,它将给定值赋予迭代器指向的元素开始的指定个元素,格式为:fill_n(vec.begin(),vec.end(),0),将所有元素重置为0(但是要注意容器不能是空的)

③介绍back_insert(一种向容器里添加元素的迭代器,在头文件iterator中)

back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器,当我们通过此迭代器赋值时,它会调用push_back将一个定值添加到容器中。例如:

vector<int>vec;
auto it=back_inserter(vec);
*it=42;

④拷贝算法

copy拷贝算法接受三个迭代器,前两个表示一个输入范围,第三个表示目的序列的起始位置。此算法将前两个参数的输入范围的元素从第三个参数的起始位置开始拷贝。传递给copy的目的序列至少要包含与输入序列一样多的元素!

inta[]={0,1,2,3,4,5,6,7,8,9};
int a2[sizeof(a1)/sizeof(*a1)]//a2与a1大小一样
auto ret=copy(begin(a1),end(a1),a2);
//ret指向拷贝到a2的尾元素之后的位置

4,重排元素的算法

sort算法接受一对迭代器,根据大小或者字典中的顺序重排序列中的顺序。

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

unique标准库算法接受一对迭代器,重排元素,使得不重复的元素出现在序列的开始,并返回一个指向不重复位置的最后一个位置的迭代器。

auto  end_unique = unique(word.begin(),word.end());

erase接受一对迭代器,删除该迭代器范围内的元素,是属于对容器操作。

erase(end_unique,word.end());







猜你喜欢

转载自blog.csdn.net/MacDonakl/article/details/79986209
今日推荐