1

によって定義されたマルチマップがあります

typedef std::pair<int, int> comp_buf_pair; //pair<comp_t, dij>
typedef std::pair<int, comp_buf_pair> node_buf_pair;
typedef std::multimap<int, comp_buf_pair> buf_map; //key=PE, value = pair<comp_t, dij>
typedef buf_map::iterator It_buf; 
int summ (int x, int y) {return x+y;}


int total_buf_size = 0;
std::cout << "\nUpdated buffer values" << std::endl;
for(It_buf it = bufsz_map.begin(); it!= bufsz_map.end(); ++it)
{
    comp_buf_pair it1 = it->second;
    // max buffer size will be summ(it1.second)
    //total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), &summ); //error??
    std::cout << "Total buffers required for this config = " << total_buf_size << std::endl;
    std::cout << it->first << " : " << it1.first << " : " << it1.second << std::endl;

}

it1.second が指すすべての値を合計したい std::accumulate 関数は、2 番目の反復子の値にどのようにアクセスできますか?

4

4 に答える 4

2

問題は summ 関数にあります。実際には、2 つの不一致の型を処理できるようにするために、それよりも優れたものが必要です。

運が良ければ、これでうまくいくかもしれません:

int summ(int x, buf_map::value_type const& v) { return x + v.second; }

運が悪い場合 ( の実装方法によって異なりますaccumulate)、いつでも次のことができます。

struct Summer
{
  typedef buf_map::value_type const& s_type;
  int operator()(int x, s_type v) const { return x + v.second.first; }
  int operator()(s_type v, int x) const { return x + v.second.first; }
};

そして、次を使用します。

int result = std::accumulate(map.begin(), map.end(), 0, Summer());
于 2010-06-24T17:32:29.950 に答える
1

summ代わりにマップ value_type を取るように関数を変更するだけでよいと思います。これは完全にテストされていませんが、アイデアが得られるはずです。

int summ (int x, const buf_map::value_type& y) 
{
    return x + y.second;
}

そしてそれを呼び出します:

total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ);

于 2010-06-24T17:26:21.553 に答える
0

Accumulateinitは総和の一般化です。これは、範囲内のすべての要素の合計 (またはその他のバイナリ演算) を計算します[first, last)

... 結果は最初に に初期化されinitます。次に、 の各反復子iについて[first, last)、最初から最後まで順番に、result = result + *i(最初のバージョンの場合) またはresult = binary_op(result, *i)(2 番目のバージョンの場合) によって更新されます。

Sgi.com

あなたの試行は最初のバージョンでも 2 番目のバージョンでもありませんでした。初期部分がありませんでした

total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ);
于 2010-06-24T17:27:32.567 に答える
0

ペアを含むペアをいじるのはなぜですか? 複雑すぎて、間違いを犯すことになります。なぜ構造体を定義しないのですか?

于 2010-06-24T17:30:49.343 に答える