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

本文包括的算法有:

一、算法简介

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

二、泛型算法

三、只读算法

find()

  //判断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()

  list<int> li{ 1,2,3,66,66,66,100 };  cout <<"The 66 count is:"   	<<count(li.cbegin(),li.cend(),66)<< endl;

accumulate()

  //计算li元素的和,和的初始值为0  list<int> li{ 1,2,3 };  cout <<"The sum is:" <<accumulate(li.cbegin(),li.cend(),0)<< endl; //6

使用string时,必须显示地调用,不能够直接使用字符串,因为这样会被accumulate函数认为是一个const char*对象而出错

  //正确  ist<string> li{"A","B","C"};  cout <<accumulate(li.cbegin(),li.cend(),string("String:"))<< endl; //String:ABC
  //错误  list<string> li{"A","B","C"};  cout <<accumulate(li.cbegin(),li.cend(),"String:")<< endl;
  //正确  list<string> li{"A","B","C"};  string s = "String:";  cout <<accumulate(li.cbegin(),li.cend(), s)<< endl;

附加:如果想要进行别的运行,例如乘、除等,可以使用参数4.例如下面是对一个数组内的元素进行乘操作(备注:初始化不要填0,否则结果就为0)

  int *p = new int[4] {1, 2, 3, 4};  cout << accumulate(p, p + 4, 1,multiplies<int>()) << endl; //24

equal()

  vector<int> vec1{ 1,2};  vector<int> vec2{ 1,2,3};  vector<int> vec3{ 1,2,3,4};  vector<int> vec4{ 1,2,3,4 };     cout << equal(vec1.cbegin(),vec1.cend(), vec4.cbegin())<< endl; //1  cout << equal(vec2.cbegin(), vec2.cend(), vec4.cbegin()) << endl; //1  cout << equal(vec3.cbegin(), vec3.cend(), vec4.cbegin()) << endl; //1
  vector<int> vec1{ 2,3};  vector<int> vec2{ 1,2,3,4 };     cout << equal(vec1.cbegin(),vec1.cend(), vec2.cbegin())<< endl; //0
  vector<string> vec1{ "A","B"};  vector<string> vec2{ "B" };  vector<const char*> vec3{ "A","B","C" };     cout << equal(vec1.cbegin(), vec1.cend(), vec3.cbegin()) << endl; //1  cout << equal(vec2.cbegin(), vec2.cend(), vec3.cbegin())<< endl; //0

四、写算法

可以读写容器内的元素,但不可以改变容器的大小。因此操作时要注意容器的大小(例如不能对空容器操作)

因为会改变值,所以不能使用只读迭代器(cbegin()、cend())

fill()

  vector<int> vec{ 1,2,3,4,5 };  fill(vec.begin(), vec.end(), 0);//将vec全部置为0  for (auto v = vec.cbegin(); v != vec.cend(); v++)  	cout << *v << endl;
  vector<int> vec{ 1,2,3,4,5,6 };  fill(vec.begin(), vec.begin()+vec.size()/2, 66); //将vec的前半部分元素变为66     for (auto v = vec.cbegin(); v != vec.cend(); v++)  	cout << *v << endl;

fill_n()

  vector<int> vec{ 1,2,3,4,5,6 };     fill_n(vec.begin(), 3, 66); //将vec的前3个元素变为66  for (auto v = vec.cbegin(); v != vec.cend(); v++)  	cout << *v << endl;     fill_n(vec.begin(), vec.size(), 66); //将vec全部变为66  for (auto v = vec.cbegin(); v != vec.cend(); v++)  	cout << *v << endl;
  //下面代码不会出错,但是也不会有效果,因为vec是空向量     vector<int> vec;  fill_n(vec.begin(), vec.size(), 66);  for (auto v = vec.cbegin(); v != vec.cend(); v++) //不打印任何信息  	cout << *v << endl;

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/483913.html

(0)
上一篇 2020年11月10日
下一篇 2020年11月10日

精彩推荐