мультикарта накапливает значения - PullRequest
1 голос
/ 24 июня 2010

У меня есть мультикарта, определенная

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 :: аккумулирует доступ к значениям второго итератора?

Ответы [ 4 ]

2 голосов
/ 24 июня 2010

Ваша проблема связана с функцией summ, вам на самом деле нужно что-то лучшее, чтобы справиться с двумя несовпадающими типами.

Если вам повезет, это может сработать:

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());
1 голос
/ 24 июня 2010

Я думаю, вам просто нужно изменить функцию 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);

0 голосов
/ 24 июня 2010

Почему вы возитесь с парами, содержащими пары? Это слишком сложно, и вы будете делать ошибки. Почему бы не определить структуру?

0 голосов
/ 24 июня 2010

Accumulate является обобщением суммирования: оно вычисляет сумму (или некоторую другую двоичную операцию) init и всех элементов в диапазоне [first, last).

..Результат сначала инициализируется до init.Затем для каждого итератора i в [first, last) в порядке от начала до конца он обновляется на result = result + *i (в первой версии) или result = binary_op(result, *i) (во второй версии).

Sgi.com

Ваша попытка не была ни первой, ни второй версией, вы пропустили часть инициализации

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