C++算法中计算相关的函数

C++算法中计算相关的函数

  • accumulate:累加函数。
  • inner_product:内积函数。
  • partial_sum:部分求和函数。
  • adjacent_difference:相邻两个元素差函数。
    上面几个函数功能都是默认的,但是在使用中可以根据自己的需要修改它的功能。如下示例中:
/*
 * @Description: 对算法中numeric中函数的一些测试和使用
 * @Author: szq
 * @Github: https://github.com/MrQqqq
 * @Date: 2020-08-11 21:00:45
 * @LastEditors: szq
 * @LastEditTime: 2020-08-12 00:27:48
 * @FilePath: \cpp\src\algorithm\numeric.cpp
 */

#include
#include
#include
#include
#include
using namespace std;

//自定义累乘,重载operator()
template<class T>
struct multi{
     
    T operator()(T &a,T &b){
     
        return a * b;
    }
};

/**
 * @destription: 测试Accumulate函数
 * @param:iv:一个序列
 * @return:none
 */
void testAccumulateFunction(vector<int> &iv){
     

    cout << "=============================testAccumulateFunction begin!=================================" << endl;
    //accumulate函数是累加,第三个参数是基数,在这个基数上累加,即 0 + 1 + 2 + 。。。
    int res = accumulate(iv.begin(),iv.end(),0);
    cout << "基数为0的累加结果为:" << res << endl;//15

    //改变基数累加
    res = accumulate(iv.begin(),iv.end(),10);
    cout << "基数为10的累加结果为:" << res << endl;//25

    //改变计算方式,使用仿函数
    res = accumulate(iv.begin(),iv.end(),0,minus<int>());
    cout << "累减的结果为:" << res << endl;//-15

    //使用lambda表达式,相当于累乘
    res = accumulate(iv.begin(),iv.end(),1,[](int a,int b){
     
        return a * b;
    });
    cout << "lambda的累乘结果为:" << res << endl;//120

    //使用可调用对象,和上面累乘一样的效果
    res = accumulate(iv.begin(),iv.end(),1,multi<int>());//multi()不是调用函数,是调用构造函数,创建一个临时对象。
    cout << "自定义可调用对象的累乘结果为:" << res << endl;//120

     cout << "=============================testAccumulateFunction end!=================================" << endl;
}

/**
 * @destription: 测试inner_product函数
 * @param {type} 
 * @return {type} 
 */
void testInnerProductFunction(vector<int> &iv){
     

    cout << "=============================testInnerProductFunction begin!=================================" << endl;
    //inner_product函数是计算各个元素操作后再操作后的结果再操作,默认是元素相乘,结果相加,效果相当于平方和
    //内部调用的是plus<>(), multiplies<>()这两个可调用对象
    int res = inner_product(iv.begin(),iv.end(),iv.begin(),
        0//基数
    );
    cout << "默认平方和为:" << res << endl;//55

    //自定义元素操作和结果操作
    res = inner_product(iv.begin(),iv.end(),iv.begin(),0,
        minus<int>(),//结果操作
        plus<int>()//元素操作;
    );//整体效果相当于元素乘以2后累减
    cout << "自定义操作后的结果为:" << res << endl;//-30

    cout << "=============================testInnerProductFunction end!=================================" << endl;
}

/**
 * @destription: 测试partial_sum函数
 * @param {type} 
 * @return {type} 
 */
void testPartialSumFunction(vector<int> &iv){
     

    cout << "=============================testPartialSumFunction begin!=================================" << endl;
    //部分相加,和保存到迭代器中,这里的效果相当于求前缀和
    vector<int> res(iv.size());
    partial_sum(iv.begin(),iv.end(),res.begin());
    cout << "前缀和结果为:";
    for(auto num : res){
     
        cout << num << " ";
    }
    cout << endl;

    //自定义操作,求前缀差
    partial_sum(iv.begin(),iv.end(),res.begin(),minus<int>());
    cout << "前缀差结果为:";
    for(auto num : res){
     
        cout << num << " ";
    }
    cout << endl;

    //自定义操作,求前缀积
    partial_sum(iv.begin(),iv.end(),res.begin(),multiplies<int>());
    cout << "前缀积结果为:";
    for(auto num : res){
     
        cout << num << " ";
    }
    cout << endl;

    cout << "=============================testPartialSumFunction end!=================================" << endl;
}

/**
 * @destription: 测试adjacent_difference函数
 * @param {type} 
 * @return {type} 
 */
void testAdjacentDifferenceFunction(vector<int> &iv){
     

    cout << "=============================testAdjacentDifferenceFunction begin!=================================" << endl;
    //相邻两个元素的差,结果保存到迭代器中
    vector<int> res(iv.size());
    adjacent_difference(iv.begin(),iv.end(),res.begin());
    cout << "响铃两个数的差结果为:";
    for(auto num : res){
     
        cout << num << " ";
    }
    cout << endl;

    //自定义操作,求相邻两个数的和
    adjacent_difference(iv.begin(),iv.end(),res.begin(),plus<int>());
    cout << "相邻两个数的和结果为:";
    for(auto num : res){
     
        cout << num << " ";
    }
    cout << endl;

    //自定义操作,求相邻两个数的积
    adjacent_difference(iv.begin(),iv.end(),res.begin(),multiplies<int>());
    cout << "相邻两个数的积结果为:";
    for(auto num : res){
     
        cout << num << " ";
    }
    cout << endl;

    cout << "=============================testAdjacentDifferenceFunction end!=================================" << endl;
}

/**
 * @destription: 测试iota函数
 * @param {type} 
 * @return {type} 
 */
void testIotaFunction(){
     

    cout << "=============================testIotaFunction begin!=================================" << endl;
    //iota函数是递增填充数字
    vector<int> nums(10);//初始化一个10个数的数组
    int n = 1;//基数,让从1开始递增
    iota(nums.begin(),nums.end(),n);
    cout << "自增填充数字后的数组为:";
    for(int num : nums){
     
        cout << num <<" ";
    }
    cout << endl;
    cout << "=============================testIotaFunction end!=================================" << endl;
}

int main(){
     
    int nums[] = {
     1,2,3,4,5};
    vector<int> iv(nums,nums + 5);
    
    //测试accumulate函数
    testAccumulateFunction(iv);

    //测试inner_product函数
    testInnerProductFunction(iv);

    //测试partial_sum函数
    testPartialSumFunction(iv);

    //测试adjacent_difference函数
    testAdjacentDifferenceFunction(iv);

    //测试iota函数
    testIotaFunction();
}

你可能感兴趣的:(C++,c++,accumulate,inner_product,partial_sum,algorithm)