std::begin(floor_plan)
std::map<int, int>::value_type
is を指すイテレータを提供しますstd::pair<const int, int>
。operator+
このペア型と整数が定義されていないため、コードはコンパイルに失敗します。
オプション1
からマップされたすべての値を合計したい場合はfloor_plan
、渡された参照解除された反復子の 2 番目の要素を抽出できる独自の二項演算子を提供する必要があります。
std::accumulate(std::begin(floor_plan)
, std::end(floor_plan)
, 0
, [] (int value, const std::map<int, int>::value_type& p)
{ return value + p.second; }
);
デモ1
オプション #2
あるいは、Boost.Iteratorライブラリを利用して、ペアの 2 番目の要素をオンザフライで抽出することもできboost::make_transform_iterator
ます。
#include <boost/iterator/transform_iterator.hpp>
#include <functional>
auto second = std::mem_fn(&std::map<int, int>::value_type::second);
std::accumulate(boost::make_transform_iterator(std::begin(floor_plan), second)
, boost::make_transform_iterator(std::end(floor_plan), second)
, 0);
デモ 2
オプション #3
別のアプローチは、アルゴリズムの独自の実装とともにBoost.Rangeライブラリを使用することです。accumulate
#include <boost/range/numeric.hpp>
#include <boost/range/adaptor/map.hpp>
boost::accumulate(floor_plan | boost::adaptors::map_values, 0);
デモ 3