- 在这里,我想说的重点是对于泛型算法,他的特点是不直接操纵容器,这是最主要的特点,这也就意味着他不会直接对容器进行操作。
- 例如容器的增删改移,算法接受的是迭代器,对迭代以及接收到的迭代器范围元素进行算法处理,而在这个过程中,就算容器发生了元素的增删改移的事件,算法对容器也不负责,主要是迭代器的责任,这也是算法的特殊之处。
- 前两个小节的主要算法如下:
#include<iostream>
#include<algorithm>
#include<numeric>
#include<vector>
#include <iterator>
using namespace std;
void output_date(const vector<int>&s)
{
for (auto i = s.begin(); i != s.end();i++)
{
cout << *i << " " ;
}
cout << endl;
}
int main(int argc, char **argv)
{
vector<int>vec{ 1, 1,1,1,1,1,1,32, 5, 6, 34, 312, 6, 21, 5, 35, 0 };
auto result = find(vec.begin(),vec.end(),18);
cout << ((result==vec.end())?"is not present":"i s the present") << endl;
int al[10] = { 213, 43, 76, 324, 67, 453, 21, 76, 4, 214 };
auto resultl = find(al + 1, al + 4, 21);
cout << *resultl<<endl;
auto resultnum = count(vec.begin(),vec.end(),1);//count也需要三个参数统计数值出现的次数
auto sum = accumulate(vec.begin(), vec.end(), 0);
auto ittsum = accumulate(al, al + 10, 0);
cout << sum << " " << ittsum << endl;
cout <<resultnum << endl;
vector<string>str={ "-86", "-679", "-2341", "-4542", "-213" };
vector<string>str1= { "-86", "-679", "-2341", "-4542", "-213" };
string sumstring = accumulate(str.cbegin(),str.cend(),string(""));
auto res = equal(str.begin(), str.end(), str1.begin());
cout << res<<endl;
vector<double>vec1{ 1, 1.3, 1, 1, 1, 1.2, 1, 32, 5, 6, 34, 312, 6, 21, 5, 35, 0 };
vector<double>vec2{ 1, 1, 1, 1, 1, 1, 1, 32, 5, 6, 34, 312, 6, 21, 5, 35, 0 };
auto doubres=accumulate(vec1.cbegin(), vec1.cend(), 0.0);
cout << doubres << endl;
vector<int >lla;
auto it = back_inserter(lla);
*it = 22;
fill_n(back_inserter(lla), 10, 0);//添加10个元素到lla中;
sort(vec.begin(), vec.end());
output_date(vec);
unique(vec.begin(), vec.end());
output_date(vec);
system("pause");
return 0;
}
测试结果如下:
对于结果主要有两点解释:
- 1. 对于上面的sort一次排序后倒数第二行出现有序的结果,然后在使用unique算法后出现的显示是这么的原理,因为unique的作用是去除排序后的相等重复元素,只留下一个。但是算法对容器是不会具有真正的操作权限的 ,他只是操纵迭代器对容器进行操作,在这个过程中,算法根本就不知道容器这个玩意儿,所以在去除重复元素后将其余元素按照顺序依次排列,但是这个过程中,容器的元素数量是不会发生改变的,所以后面会出现什么算法是不知道的剩下的就是,迭代器的事了。
主要代码就是这上面的了,如有错误欢迎指出