STL常用数值算法
<span style="font-size:18px;">#include<iostream>
#include<vector>
#include<iterator>
#include<algorithm>
#include<functional>
#include<string>
#include<numeric>
using namespace std;
//数值算法
/*
accumulate 累加或者类乘
partial_sum 局部求和
fill fill_n 填充 初始化时使用方便
equal判断两区间是否相等
for_each 相当于for循环
copy 这个函数用法实在太多</span>
<span style="font-size:18px;">还有一些很简单的数值算法 并未列出
*/
template<class T>
class Display
{
public:
void operator()(const T& val)
{
cout << val << " ";
}
};
int main(void)
{
int a[] = { 5,1,3,7,9,-5 };
int len = sizeof(a) / sizeof(a[0]);
vector<int> Vec(a,a+len);
cout << accumulate(Vec.begin(),Vec.end(),0)<<endl;//20
//数值求和算法 记住最后一个为初值
cout << accumulate(Vec.begin(), Vec.end(),0, minus<int>())<<endl;//-20
typedef ostream_iterator<int> O_ITE;
O_ITE oite(cout," ");
partial_sum(a,a+3,oite);//5 6 9局部求和 第n个元素为前n个元素的总和 用在map里很好
cout<<pow(1,0.5);//这个函数有7个重载 所以使用时 不用去理会它的参数
int a1[10];
puts("");
for_each(a1,a1+10,Display<int>());//一堆 乱值
fill(a1,a1+10,-1);
puts("");
for_each(a1,a1+10,Display<int>());//全部为 -1
fill_n(a1,5,0);//从迭代器开始位置 填充 5个 0
//返回的迭代器 指向最后一个被填充的下一个位置
puts("");
for_each(a1, a1 + 10,Display<int>());//全部为 -1
iter_swap(a,a1);//这个和c中的使用指针交换 一样 在不同对象的迭代器 也可以使用
swap(*a,*a1);//C++的引用交换方式
puts("");
for_each(a1, a1 + 10, Display<int>());//一堆 乱值
//Vec.pop_back();
//这个函数 很奇怪 必须保证第二个区间的元素长度大于等于 第一个区间 否则出错
//函数只保证在该区间 两个序列相同 所以要完全相等 必须 同时判断长度
bool bFlag=equal(a,a+len,Vec.begin());
if (bFlag)
{
puts("\nwe are same!");
}
//copy 函数效率很高 使用很频繁
int *pAraa = new int[Vec.size()]();
copy(Vec.begin(), Vec.end(), a);
//输出区间的起点 与输入区间重叠 可能会出问题(其它情况是不会的)
//copy 会根据迭代器的性质来决定调用哪个版本的copy
//对于原生指针 会调用memmove 其它类型会执行实际拷贝操作
//vector 的指针不仅是个randomiterator 而且是个 T* 因此 拷贝时会使用 memmove
//与copy类似的还有 copy_backward 只不过 是将一个区间的元素 逆向复制到另一个区间(也是逆向拷贝)
for_each(a,a+Vec.size(),Display<int>());
return 0;
}
</span>