accumuler des valeurs de multimap
-
29-09-2019 - |
Question
J'ai un multimap défini par
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;
}
Je voudrais résumer toutes les valeurs pointées par it1.second Comment le std :: accès aux fonctions Accumuler les secondes valeurs iterator?
La solution
Votre question est avec la fonction Somm, vous avez réellement besoin de quelque chose de mieux que d'être en mesure de traiter 2 types dépareillées.
Si vous avez de la chance, cela pourrait fonctionner:
int summ(int x, buf_map::value_type const& v) { return x + v.second; }
Si vous êtes malchanceux (selon la façon dont accumulate
est mis en œuvre), vous pouvez toujours:
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; }
};
Et puis utilisez:
int result = std::accumulate(map.begin(), map.end(), 0, Summer());
Autres conseils
Je pense que vous aurez juste besoin de changer votre fonction summ
de prendre la carte value_type à la place. Ceci est tout à fait non testé, mais il devrait donner l'idée.
int summ (int x, const buf_map::value_type& y)
{
return x + y.second;
}
Et appeler:
total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ);
Pourquoi avez-vous déconner avec des paires contenant des paires? Il est trop compliqué et vous aurez le vent faire des erreurs. Pourquoi ne pas définir une struct?
Accumulate
est une généralisation de la somme:. On calcule la somme (ou une autre opération binaire) deinit
et tous les éléments de la gamme[first, last)
... Le résultat est d'abord initialisé à
init
. Ensuite, pour chaquei
iterator dans[first, last)
, afin de début à la fin, il est mis à jour parresult = result + *i
(dans la première version) ouresult = binary_op(result, *i)
(dans la deuxième version).
Votre tentative ne fut ni la première ou deuxième version, vous avez manqué la partie init
total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ);