13

std::map<std::string, size_t>forループを使用せずにコレクション内のすべての値を合計する方法は? マップは、クラスのプライベート メンバーとして存在します。累積はパブリック関数呼び出しで実行されます。

ブーストやその他のサードパーティを使用したくありません。

4

2 に答える 2

23

これは、ラムダと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 を使用する場合は、代わりに一般的なラムダを使用して、ラムダの可読性を向上させることができます。

[](const std::size_t previous, const auto& element)
{ return previous + element.second; }
于 2012-12-28T18:35:15.793 に答える
5

std::accumulateを使用します。ただし、舞台裏でループを使用する可能性が非常に高くなります。

于 2012-12-28T18:18:22.913 に答える