Domanda

Ho un multimap definito da

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;

}

vorrei sommare tutti i valori a punta da it1.second Come può lo std :: accesso alle funzioni si accumulano i valori secondo iteratore?

È stato utile?

Soluzione

Il problema è con la funzione summ, è in realtà bisogno di qualcosa di meglio per essere in grado di gestire 2 tipi non corrispondenti.

Se siete fortunati, questo potrebbe funzionare:

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

Se siete sfortunati (a seconda di come viene implementato accumulate), si può sempre:

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; }
};

E poi l'uso:

int result = std::accumulate(map.begin(), map.end(), 0, Summer());

Altri suggerimenti

Credo che avrete solo bisogno di cambiare la vostra funzione summ di prendere la mappa value_type invece. Questo è totalmente testato ma dovrebbe dare l'idea.

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

E lo chiamano:

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

Perché si fa confusione in giro con coppie che contiene coppie? Si è troppo complicato e finirai commettere errori. Perché non definire una struct?

  

Accumulate è una generalizzazione di sommatoria:. Calcola la somma (o qualche altra operazione binaria) di init e tutti gli elementi nell'intervallo [first, last)

     

... Il risultato viene prima inizializzato a init. Quindi, per ogni iterazione in i [first, last), al fine dall'inizio alla fine, viene aggiornato da result = result + *i (nella prima versione) o result = binary_op(result, *i) (nella seconda versione).

     

Sgi.com

Il tuo tentativo era né prima o la seconda versione, vi siete persi la parte init

total_buf_size = std::accumulate(bufsz_map.begin(), bufsz_map.end(), 0, &summ);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top