Ho un contenitore di libreria standard di grandi numeri, così grande da poter causare un overflow se li aggiungo insieme. Facciamo finta che sia questo contenitore:Come posso usare std :: accumulate e un lambda per calcolare una media?
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
voglio calcolare la media di questo contenitore, utilizzando std :: si accumulano, ma non posso aggiungere tutti i numeri insieme. Lo calcolerò semplicemente con v[0]/v.size() + v[1]/v.size() + ...
. Così mi sono messo:
auto lambda = ...;
std::cout << std::accumulate(v.begin(), v.end(), 0, lambda) << std::endl;
Ecco quello che ho provato finora, dove ->
indica l'uscita:
lambda = [&](int a, int b){return (a + b)/v.size();}; -> 1
lambda = [&](int a, int b){return a/v.size() + b/v.size();}; -> 1
lambda = [&](int a, int b){return a/v.size() + b;}; -> 10
Come posso produrre la corretta media in modo tale che l'uscita sarà 5
?
'5' non è la risposta corretta. –
@BenVoigt È se si utilizza la divisione integer. – EMBLEM
La divisione intera non viene utilizzata nel calcolo di una media. Combinato con 'std :: accumulate', è anche peggio - rovinerà le tue somme parziali. Se vuoi che il risultato finale sia arrotondato secondo le regole della divisione intera, dovresti dire esplicitamente nella tua domanda (e quindi non stai trovando una media). Altrimenti l'uso della divisione intera sembra un bug per ogni lettore. –