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 函数如何访问第二个迭代器值?

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

Accumulate是 summation 的概括:它计算initrange 中所有元素的和(或其他一些二元运算) [first, last)

...结果首先初始化为init. 然后,对于 中的每个迭代器i[first, last)按照从头到尾的顺序,更新result = result + *i(在第一个版本中)或result = binary_op(result, *i)(在第二个版本中)。

sgi.com

您的尝试既不是第一个版本也不是第二个版本,您错过了 init 部分

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 回答