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?

Était-ce utile?

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) de init et tous les éléments de la gamme [first, last)

     

... Le résultat est d'abord initialisé à init. Ensuite, pour chaque i iterator dans [first, last), afin de 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 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top