C++算法与泛型算法(algorithm、numeric)

2020-02-20 12:00:58王冬梅

本文包括的算法有:

只读算法:find()、count()、accumulate()、equal() 写算法:fill()、fill_n()、back_inserter()、copy()、copy_backward()、replace()、replace_copy()、next_permutation()、prev_permutation() 重排元素算法:sort()、stable_sort()、unique()

一、算法简介

大多数算法在头文件algorithm中。标准库还在头文件numeric中定义了一组数值泛型算法
算法是如何工作的:

迭代器令算法不依赖于容器类型:算法不依赖于容器所保存的元素类型。只要有一个迭代器可以来访问元素,就可以进行运算 但算法依赖于元素类型的操作:虽然迭代器令算法不依赖于容器类型,但大多数算法都是用了一个(多个)元素类型上的操作。例如find用元素类型的==运算符完成每个元素与给定值的比较。其他算法可能要求元素类型支持“<”运算符。不过,我们将看到,大多数算法提供了一种方法,允许我们使用自定义的操作来替代默认的运算符

二、泛型算法

标准库提供了超过100个算法,这些算法都对一个范围内的元素来进行操作 算法基本上分为3类:是否读取元素、改变元素、重排元素顺序

三、只读算法

只可以操作容器元素,不可以改变容器内的值 因为是只读,所以建议使用只读迭代器(cbegin()、cend())

find()

功能:遍历一个范围中是否包含某元素 参数:前2个参数是一个迭代器范围或者指针范围。第3个参数是要查找的元素 返回值:成功返回要查找的元素所在的迭代器。失败返回参数2
//判断value在vec中是否存在,因为find如果失败返回的是参数2.所以可以用来判断是否查找成功
 
vector<int> vec{ 1,2,3};
int value = 2;
auto result=find(vec.cbegin(),vec.cend(), value);
cout << "The value " << value << (result == vec.cend()
 ? "is not present" : "is present") << endl;
vector<string> vec{ "A","B","C" };
auto result=find(vec.cbegin(),vec.cend(), "B");
cout << "The B "<< (result == vec.cend()
 ? "is not present" : "is present") << endl;

对数组的操作:可以用内置函数begin()、end()作为数组的迭代器,也可以用指针作为迭代器

int arr[] = { 1,2,3,4,5 };
int val = 4;
int* result = find(begin(arr), end(arr), val);
if (result != end(arr)) {
 cout << "find succcess,value is:"<< *result<< endl;
}
int arr[] = { 1,2,3,4,5 };
int value = 3;
auto result = find(arr + 1, arr + 3, value);
cout << "The value "<<value<<((result == arr + 3)
	?" is not present":"is present")<< endl;

count()

功能:返回元素在指定迭代器范围内出现的次数 返回值:成功返回出现的次数,没有返回0