泛型算法不会执行容器操作,而是运行在迭代器上
#include<iostream>
#include<vector>
#include<numeric>
#include<iterator>
using namespace std;
int main() {
/*
*只读算法,最好使用cbegin()来操作迭代器
*/
vector<int> a1(10, -1);
auto p1 = find(a1.cbegin(), a1.cend(), 3);//在两个迭代器范围内寻找3
if (p1 == a1.end());//若无匹配元素,则返回第二个参数
cout << "没有此元素" << endl;
auto n1 = count(a1.cbegin(), a1.cend(), -1);//count用于统计-1在a1中出现次数
cout << n1<<endl;
cout << accumulate(a1.cbegin(), a1.cend(), 10) << endl;//计算元素和,第三个参数是和的初值
//可通过此操作将字符串链接起来,因为string有定义+运算符
vector<int>a2(20, -1);
cout << equal(a1.cbegin(), a1.cend(), a2.cbegin()) << endl;//判断两序列是否相等,
//元素不必一致,能运算==即可,比如string和const char*,默认假定第二个序列至少和第一个一样长
//上式输出1,因为a1与在a2中对应的元素都相等
/*
*写容器算法,要保证容器原大小至少不小于要写的元素数目,!!!算法不执行容器操作,不可改变容器大小
*/
fill(a1.begin(), a1.end(), 1);//向给定输入序列写入数据
fill_n(a1.begin(), 5, 2);//从第一个参数指定的元素开始,写入n(5)个值为2的元素
//假定目的位置足够容纳要写入的元素数
auto it = back_inserter(a1);//******保证算法有足够空间容纳输出数据****
*it = 3; //通过次迭代器赋值会调用push_back
cout << a1[a1.size() - 1] << endl;//输出3
*it = 4;
cout << a1[a1.size() - 1] << endl;//输出4
fill_n(it, 3, 5); //添加3个5
cout << a1[a1.size() - 1] << endl <<a1[a1.size() - 2] << endl;//输出两个5
auto p2=copy(a1.begin(), a1.end(), a2.begin());//将指定范围的元素拷贝到第三个参数表示的序列起始位置
//目的序列必须包含至少与输入序列同样多的元素,p2是指向a2中拷贝的尾元素下一个位置的迭代器
}