2010-06-24 44 views
1

je un multimap défini parmultimap accumulent les valeurs

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 :: accumuler accès aux fonctions les secondes valeurs iterator?

+1

Salut, si vous les itérez de toute façon, pourquoi ne pas ajouter cela à votre boucle? 'total_buf_size + = it1.second;' – nus

+1

Que voulez-vous dire par "toutes les valeurs" dans it1.second? It1.second est juste un int. Il n'y a qu'une valeur de valeur. –

+0

@ufotds parfois l'étape la plus simple résout le problème. J'ai utilisé ce que vous avez mentionné 'total_buf_size + = it1.second;'. J'ai été influencé en essayant d'utiliser accumulate basé sur les exemples de STL pour le conteneur de vecteur. J'essayais aussi d'éviter de faire une boucle dans le conteneur. – vivekv80

Répondre

2

Votre problème est avec la fonction summ, vous avez vraiment besoin de quelque chose de mieux que cela pour pouvoir gérer 2 types discordants.

Si vous êtes chanceux, 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()); 
+0

Ce que je ne comprends pas, 'accumulator' n'appellerait pas la fonction avec' buf_map' plutôt que son 'buf_map.value_type'? – nus

+0

ahh comment le code est-il surligné dans les commentaires? hmm. – vivekv80

+0

@ vivekv80: avec des retours, mais je ne sais pas si ça marche pour de longues séquences. –

1

Je pense que vous aurez juste besoin de changer votre fonction summ pour prendre la carte value_type à la place. Ceci est totalement non testé mais il devrait donner l'idée.

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

et l'appeler:

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

+0

Ne fonctionne pas car l'initialiseur est un 'int' et' summ' ne prend pas un 'int' comme paramètre ici. –

+0

Je pense qu'il faut réellement prendre un buf_map, et et retourner un buf_map temporaire avec le second étant mis à la somme pour fonctionner. Voir: http://www.cplusplus.com/reference/std/numeric/accumulate/ – nus

0

Accumulate est une généralisation de sommation: il calcule la somme (ou une autre opération binaire) de init et tous les éléments dans la gamme [first, last). Le résultat est initialisé en init. Ensuite, pour chaque itérateur i dans [first, last), dans l'ordre du début à la fin, il est mis à jour par result = result + *i (dans la première version) ou result = binary_op(result, *i) (dans la deuxième version).

Sgi.com

Votre tentative n'a été ni 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); 
0

Pourquoi vous déconner avec des paires contenant des paires? C'est trop compliqué et vous finirez par faire des erreurs. Pourquoi ne pas définir une structure?

+1

Cela ne résoudrait pas le problème ... mais merci quand même, je suppose. –