【问题标题】:How to sum all values in the std::map?如何对 std::map 中的所有值求和?
【发布时间】:2012-12-13 23:26:31
【问题描述】:

如何在不使用 for 循环的情况下对 std::map<std::string, size_t> 集合中的所有值求和?映射作为私有成员驻留在类中。在公共函数调用中进行累加。

我不想使用 boost 或其他 3rd 方。

【问题讨论】:

  • 我想在不下水的情况下畅游大西洋?还是您只是想避免自己编写 for 循环?
  • 我正在寻找类似于 C# 中的 LINQ 函数
  • 他们使用循环,只是不那么明显。
  • 我知道幕后是循环。我只想用一行代码使用快捷方式
  • 为什么这个问题因为没有建设性而被关闭?这是个好问题。

标签: c++ map std


【解决方案1】:

您可以使用 lambda 和 std::accumulate 执行此操作。请注意,您需要一个最新的编译器(至少 MSVC 2010、Clang 3.1 或 GCC 4.6):

#include <numeric>
#include <iostream>
#include <map>
#include <string>
#include <utility>

int main()
{
    const std::map<std::string, std::size_t> bla = {{"a", 1}, {"b", 3}};
    const std::size_t result = std::accumulate(std::begin(bla), std::end(bla), 0,
                                          [](const std::size_t previous, const std::pair<const std::string, std::size_t>& p)
                                          { return previous + p.second; });
    std::cout << result << "\n";
}

Live example here.

如果您使用 C++14,则可以改用泛型 lambda 来提高 lambda 的可读性:

[](const std::size_t previous, const auto& element)
{ return previous + element.second; }

【讨论】:

  • #include 丢失
  • @ChesnokovYuriy 已修复。 GCC 没听懂,谢谢。
  • 引入 lambdas 的好例子!
  • 对于那些试图缩短函数调用的人,请尝试std::accumulate(bla.begin(), bla.end(), 0, [](const size_t previous, decltype(*bla.begin()) p) { return previous+p.second; });
【解决方案2】:

使用 std::accumulate。但它很可能会在幕后使用循环。

【讨论】:

  • 怎么用?可以提供代码示例吗?
  • 没有。我现在必须喂我的孩子。查找 4 参数版本。
  • 您希望您的帖子被标记为答案吗?我不想为第四个参数声明附加函数并使用一些内联绑定
  • @ChesnokovYuriy 然后使用 lambda。
  • @ChesnokovYuriy 看到我的答案。
猜你喜欢
  • 1970-01-01
  • 2015-06-20
  • 2017-10-16
  • 2023-03-24
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多