// 泛型算法(generic algorithm),大部分定义在 algorithm.h 中,numeric.h 定义了一组数值泛型算法
// 1>访问序列中首元素
// 2>元素运算
// 3>满足条件,返回结果
// 4>否则继续查找
// 5>到达序列尾,停止
// 6>返回未找到的值,类型同3一样
// 除步骤2外,都可以使用迭代器操作,所以不依赖容器
// 但步骤2的操作需要元素类型的支持
// 算法永远不会执行容器操作,可能改变元素的值或顺序,但不会直接添加删除元素,不会改变容器的大小
// 只读算法
// 在指定容器迭代器范围内查找 val,返回指向 val 的迭代器或尾后迭代器
// find(range, val)
// sum 为和的初值,将指定容器迭代器范围内的元素进行 + 运算,然后和 sum + 运算,容器的元素必须能转换为 sum 的类型
// accumulate(range, sum)
// 将指定容器c1 迭代器范围内的元素,依次和 c2 对位的元素进行 == 运算
// c2 仅指定首元素,所以要保证 c2 的元素个数大于等于 c1 指定范围的元素个数所有类似算法都有此类要求
// equal(c1.range, c2.cbegin())
// 写容器操作,容器的大小必须大于等于算法要求写入的元素数量,算法不执行容器操作,自身不会改变容器大小
// 将 val 赋给指定的迭代器范围内的元素
// fill(range, val)
// 将 val 赋给指定的迭代器 iter 开始后 n 个元素,容器从 iter 元素开始至少有 n 个元素
// fill_n(iter, n, val)
//返回容器的插入迭代器(insert iterator),通过插入迭代器可以将赋值符号右侧的值添加到容器中
// auto i = back_inserter(c);
// *i = 24;
// fill_n(back_inserter(c), 10, 0); 向 c 添加10个0
// 将指定容器c1 迭代器范围内的元素,拷贝到 c2,同样需要保证 c2 的容量
// copy(range, c2.cbegin());
// 在指定容器迭代器范围内查找 res,然后全部替换为 des
// replace(range, res, des)
// 拷贝指定容器迭代器范围内的元素到 c2,并将 c2中的 res,全部替换为 des
// replace(range, c2.begin(), res, des)
// 容器排序
// 重新排序指定范围的元素,默认 < 运算,也可以指定函数或对象指定规则
// sort(range)
// sort(range,pfunc)
#include<iostream>
#include<numeric>
#include<vector>
#include<algorithm>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
void practice_10_4();
void sort_unique();
int main()
{
practice_10_4();
sort_unique();
}
void practice_10_4()
{
vector<double> vd{234.0,4234,234.345,234.52};
int sum = accumulate(vd.cbegin(), vd.cend(), 0);
cout << sum << endl;
}
bool myfunction (int i,int j) { return (i>j); }
void sort_unique()
{
vector<int> vi{1,43,42,823,3,2,43,823,345,8534,234,234};
sort(vi.begin(), vi.end(),myfunction);
for(auto n : vi)
cout << "after_sort: " << n << endl;
auto end_unique = unique(vi.begin(), vi.end());
for(auto n : vi)
cout << "after_unique: " << n << endl;
vi.erase(end_unique, vi.end());
for(auto n : vi)
cout << "after_erase: " << n << endl;
}