模板编程挑战:实现T accum(vector v)函数求向量元素“总和”
实现通用累加/拼接模板函数
accum的解决方案 嘿,这道编程挑战正好踩中了C++泛型编程的核心点!咱们可以用模板函数轻松实现这个既能求和又能拼接字符串的通用功能,我来给你一步步拆解:
核心思路
这个需求的关键在于利用C++的运算符重载和模板参数:
- 数值类型(int、double等)的
+=是做加法求和 std::string的+=是做字符串拼接- 用
T()(或T{})生成的默认值作为初始结果:数值类型是0,字符串是空串,完美符合我们的初始需求
完整代码实现
#include <vector> #include <string> template <typename T> T accum(const std::vector<T>& v) { // 用默认构造创建初始结果:数值为0,字符串为空 T result{}; // 遍历向量,用+=完成累加/拼接 for (const auto& elem : v) { result += elem; } return result; }
代码细节说明
- 为什么用
const std::vector<T>&作为参数?:避免对传入的大向量做不必要的拷贝,提升程序性能,同时保证不会修改原向量的内容。 T result{}:和题目里的T()效果完全一致,只是用了更现代的列表初始化语法,可读性更好。- 范围for循环:简洁遍历向量中的每个元素,比传统的迭代器写法更直观。
测试用例验证
你可以用下面的代码测试不同类型的效果:
#include <iostream> int main() { // 整数求和 std::vector<int> ints = {1, 2, 3, 4, 5}; std::cout << "整数累加结果:" << accum(ints) << "\n"; // 输出15 // 浮点数求和 std::vector<double> doubles = {1.1, 2.2, 3.3}; std::cout << "浮点数累加结果:" << accum(doubles) << "\n"; // 输出6.6 // 字符串拼接 std::vector<std::string> strs = {"I", " ", "love", " ", "C++!"}; std::cout << "字符串拼接结果:" << accum(strs) << "\n"; // 输出I love C++! return 0; }
额外注意点
这个函数要求类型T必须满足两个条件:
- 支持
+=运算符重载(C++标准库的数值类型和string都满足) - 有可用的默认构造函数(题目已经明确说明
T()是有效的,所以不用担心)
内容的提问来源于stack exchange,提问作者Kenneth Freeman
相关产品推荐
相关产品推荐

