MultiMap накапливает значения
-
29-09-2019 - |
Вопрос
У меня есть мультимап, определяемый
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. Как STD :: накапливается функция доступа к значениям второго итератора?
Решение
Ваша проблема с функцией SOMM, вам действительно нужно что-то лучшее, чем можно справиться с двумя несоответствующими типами.
Если вам повезет, это может работать:
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());
Другие советы
Я думаю, что вам просто нужно изменить свой 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);
Почему вы связываетесь с парами, содержащими пары? Это слишком сложно, и вы укажите ошибки. Почему бы не определить структуру?
Accumulate
является обобщением суммирования: он вычисляет сумму (или какую-то другую бинарную работу)init
и все элементы в диапазоне[first, last)
.... результат сначала инициализируется для
init
. Отказ Тогда для каждого итератораi
в[first, last)
, чтобы от начала до конца он обновляетсяresult = result + *i
(в первой версии) илиresult = binary_op(result, *i)
(во второй версии).
Ваша попытка не была ни первой или второй версией, вы пропустили часть init
total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ);