如何对std::map中的所有值进行求和?

17

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

我不想使用 boost 或其他第三方库。


1
我想游过大西洋,但不想下水?还是你只是想避免自己编写for循环? - bmargulies
我正在寻找类似于C#中的LINQ函数。 - Chesnokov Yuriy
他们使用循环,只是不太明显。 - Puppy
我知道幕后是循环。我想用只有一行代码的快捷方式。 - Chesnokov Yuriy
8
为什么这个问题被关闭为“不具建设性”?这是一个好问题。 - ABCD
为什么这个问题被关闭了,它完全没有问题啊。 - Luke
2个回答

29

你可以使用 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";
}

点击此处查看实时示例.

如果您使用C++14,您可以使用通用lambda表达式来提高lambda的可读性:

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

3
#include <numeric> 缺失。 - Chesnokov Yuriy
@ChesnokovYuriy 已修复。GCC没有发现这个问题,谢谢。 - rubenvb
介绍Lambda函数的绝佳示例! - kebs
1
对于那些试图缩短函数调用的人,可以尝试使用 std::accumulate(bla.begin(), bla.end(), 0, [](const size_t previous, decltype(*bla.begin()) p) { return previous+p.second; }); - Tigran Saluev

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

如何使用它?你能提供代码示例吗? - Chesnokov Yuriy
5
不行,我现在得喂孩子了。请寻找包含4个参数的版本。 - Tomek
@ChesnokovYuriy 然后使用一个 lambda。 - rubenvb
当然可以:)@BillyONeal 不知道如何使用 lambda。 - Chesnokov Yuriy
@Tomek 谢谢。如果它能够在03实现中工作,我认为它必须是供应商支持的,因为它显然不是标准的?(我之所以问是因为我以前在C++11接近完成之前就使用过它,没有遇到问题,但只在一个特定平台上尝试过,从未尝试其他平台。谢谢。) - WhozCraig
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接