如何在数组算术运算函数中减少代码重复?
减少C++数组算术运算代码重复的方案
你的三个函数(add/sub/mul)核心逻辑高度一致:都是从数组首个元素开始,遍历剩余元素进行累积计算,唯一差异是累积时使用的运算符。要消除重复,关键是把通用的遍历累积逻辑抽离,将运算逻辑作为参数传入,具体有几种实现方式:
方式1:自定义通用累积函数+函数指针
把重复的循环逻辑封装成一个通用函数,用函数指针传递不同的运算规则:
#include <iostream> // 通用累积函数:接收数组长度、数组指针,以及运算逻辑函数指针 int accumulate(int numcount, int numarr[], int (*op)(int, int)) { int total = numarr[0]; for (int i = 1; i < numcount; ++i) { total = op(total, numarr[i]); } return total; } // 分别定义加法、减法、乘法的运算逻辑 int add_op(int a, int b) { return a + b; } int sub_op(int a, int b) { return a - b; } int mul_op(int a, int b) { return a * b; } int main(int argc, char* argv[]) { const int n = 5; int arr[n] = {1, 2, 3, 4, 5}; std::cout << "Addition: " << accumulate(n, arr, add_op) << std::endl; std::cout << "Subtraction: " << accumulate(n, arr, sub_op) << std::endl; std::cout << "Multiplication: " << accumulate(n, arr, mul_op) << std::endl; }
方式2:自定义通用函数+Lambda表达式(C++11及以上)
用Lambda替代单独的运算函数,代码更紧凑,无需额外定义全局/静态函数:
#include <iostream> int accumulate(int numcount, int numarr[], int (*op)(int, int)) { int total = numarr[0]; for (int i = 1; i < numcount; ++i) { total = op(total, numarr[i]); } return total; } int main(int argc, char* argv[]) { const int n = 5; int arr[n] = {1, 2, 3, 4, 5}; std::cout << "Addition: " << accumulate(n, arr, [](int a, int b){ return a + b; }) << std::endl; std::cout << "Subtraction: " << accumulate(n, arr, [](int a, int b){ return a - b; }) << std::endl; std::cout << "Multiplication: " << accumulate(n, arr, [](int a, int b){ return a * b; }) << std::endl; }
方式3:直接使用标准库std::accumulate(推荐)
C++标准库<numeric>中的std::accumulate已经实现了通用累积逻辑,直接复用即可,无需自己写循环:
#include <iostream> #include <numeric> // 必须包含此头文件 int main(int argc, char* argv[]) { const int n = 5; int arr[n] = {1, 2, 3, 4, 5}; // 加法:std::accumulate默认行为就是加法 std::cout << "Addition: " << std::accumulate(arr, arr + n, arr[0]) << std::endl; // 减法:从第二个元素开始累积,自定义减法逻辑 std::cout << "Subtraction: " << std::accumulate(arr + 1, arr + n, arr[0], [](int a, int b){ return a - b; }) << std::endl; // 乘法:同理自定义乘法逻辑 std::cout << "Multiplication: " << std::accumulate(arr + 1, arr + n, arr[0], [](int a, int b){ return a * b; }) << std::endl; }
以上三种方式都能有效消除代码重复,其中std::accumulate是最符合C++编程规范的方案,优先推荐使用。
内容的提问来源于stack exchange,提问作者Tuilip Sharma
相关产品推荐
相关产品推荐

