How to sum all values in std::map<std::string, size_t> collection without using for loop? The map resides as private member in a class. Accumulation is performed in public function call.
I do not want to use boost or other 3rd parties.
How to sum all values in std::map<std::string, size_t> collection without using for loop? The map resides as private member in a class. Accumulation is performed in public function call.
I do not want to use boost or other 3rd parties.
You can do this with a lambda and std::accumulate. Note you need an up to date compiler (at least MSVC 2010, Clang 3.1 or GCC 4.6):
#include <numeric> #include <iostream> #include <map> #include <string> 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, // initial value of the sum [](const std::size_t previous, const std::pair<const std::string, std::size_t>& p) { return previous + p.second; } ); std::cout << result << "\n"; } If you use C++14, you can improve the readability of the lambda by using a generic lambda instead:
[](const std::size_t previous, const auto& element) { return previous + element.second; } std::accumulate(bla.begin(), bla.end(), 0, [](const size_t previous, decltype(*bla.begin()) p) { return previous+p.second; });.Use std::accumulate. But it very likely will use loop behind the scenes.