如何总结 C 向量的元素?

新手上路,请多包涵

找到 std::vector 中所有元素之和的 方法是什么?

假设我有一个向量 std::vector<int> vector 有一些元素。现在我想找到所有元素的总和。相同的方法有哪些不同?

原文由 Prasoon Saurav 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 439
2 个回答

其实方法也不少。

 int sum_of_elems = 0;

C++03

  1. 经典 for 循环:
     for(std::vector<int>::iterator it = vector.begin(); it != vector.end(); ++it)
        sum_of_elems += *it;

  1. 使用标准算法:
     #include <numeric>

    sum_of_elems = std::accumulate(vector.begin(), vector.end(), 0);

重要说明: 最后一个参数的类型不仅用于初始值,还用于 _结果的类型_。如果你把一个 int 放在那里,即使向量有浮点数,它也会累积 int。如果要对浮点数求和, 0 更改为 0.00.0f感谢 nneonneo )。另请参阅下面的 C++11 解决方案。

C++11 及更高版本

  1. 湾。即使在未来发生变化的情况下,也会自动跟踪向量类型:
     #include <numeric>

    sum_of_elems = std::accumulate(vector.begin(), vector.end(),
                                   decltype(vector)::value_type(0));

  1. 使用 std::for_each
     std::for_each(vector.begin(), vector.end(), [&] (int n) {
        sum_of_elems += n;
    });

  1. 使用基于范围的 for 循环( 感谢 Roger Pate ):
     for (auto& n : vector)
        sum_of_elems += n;

C++17 及以上

  1. 使用 std::reduce 它也处理结果类型,例如,如果你有 std::vector<int> ,你会得到 int 结果。如果你有 std::vector<float> ,你会得到 float 。或者如果你有 std::vector<std::string> ,你会得到 std::string (所有字符串连接)。很有趣,不是吗?
    auto result = std::reduce(v.begin(), v.end());

此函数还有其他重载,您甚至可以并行运行,以防万一您有大量集合并且想要快速获得结果。

原文由 Prasoon Saurav 发布,翻译遵循 CC BY-SA 4.0 许可协议

std::accumulate 可能存在溢出问题,因此最好的方法是对更大的数据类型变量进行基于范围的累积以避免溢出问题。

 long long sum = 0;
for (const auto &n : vector)
  sum += n;

然后使用 static_cast<> 进一步向下转换为适当的数据类型。

原文由 Dhruv Kakadiya 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题