utilisation de std::accumulate
Besoin de plus joli solution de l'exemple ci-dessous, mais avec std::accumulate.
#include <algorithm>
#include <vector>
#include <iostream>
class Object
{
public:
Object( double a, double b ):
a_( a ),
b_( b )
{}
double GetA() const { return a_; }
double GetB() const { return b_; }
//other methods
private:
double a_;
double b_;
};
class Calculator
{
public:
Calculator( double& result ):
result_( result )
{}
void operator() ( const Object& object )
{
//some formula
result_ += object.GetA() * object.GetB();
}
private:
double& result_;
};
int main()
{
std::vector< Object > collection;
collection.push_back( Object( 1, 2 ) );
collection.push_back( Object( 3, 4 ) );
double result = 0.0;
std::for_each( collection.begin(), collection.end(),
Calculator( result ) );
std::cout << "result = " << result << std::endl;
return 0;
}
Alors pourquoi ne pas utiliser std::accumulate? Quelle est exactement la question?
Bon, je me demandais qu'est-ce que mon code est manquant 🙂
Acumulate retourne quoi? J'ai pensé qu'il retourne le même type comme un objet, non?
vector<T>::value_type qui dans votre cas sera un double.
pourquoi vector<T>::valie_type est double et n'est l'Objet?
Bon, je me demandais qu'est-ce que mon code est manquant 🙂
Acumulate retourne quoi? J'ai pensé qu'il retourne le même type comme un objet, non?
vector<T>::value_type qui dans votre cas sera un double.
pourquoi vector<T>::valie_type est double et n'est l'Objet?
OriginalL'auteur Mykola Golubyev | 2009-03-06
Vous devez vous connecter pour publier un commentaire.
faire des changements dans le Calculateur et la fonction principale.
en outre, il pourrait être mieux:
OriginalL'auteur bayda
Mise À Jour 2: Coup De Pouce.Lambda en fait un morceau de gâteau:
Mise à jour: Cette a été mise sur écoute de moi pendant un moment. Je ne peux pas juste faire de la STL algorithmes de travailler d'une manière décente. Donc, j'ai roulé ma propre:
Bien sûr, la solution d'origine tient toujours:
Le plus simple est de mettre en œuvre un
operator+
. Dans ce cas:et en faire un ami de
Object
ou membre (pourquoi on peut préférer l'un sur l'autre):et vous êtes fait avec:
Mon heure approche ne fonctionne pas parce que nous avons besoin d'un
binary_function
.std::accumulate manuel.
"résultat" n'est pas initialisé.
Je pense que le troisième paramètre à s'accumuler doit être de 0 pas de résultat. le résultat n'a pas encore été défini à ce stade.
À droite sur. Copier collé qui de OPs code 😛
Il ne devrait pas. 0 est un entier (int). Passer 0.0, qui est un double.
OriginalL'auteur dirkgently
ici est un problème ici, je suppose que les arguments sont écrites dans le mauvais ordre devrait être:
dans ce cas de s'accumuler, le résultat est contenu dans un Objet retourné.
Si vous utilisez gnu mode parallèle le foncteur vous donneront des problèmes si la raison et le réel de l'objet référencé par l'itérateur sont différents.
ne fonctionnera pas avec gnu mode parallèle pour quelque étrange et stupide raison.
OriginalL'auteur Painless Coding
À l'aide de c++0x:
OriginalL'auteur Andy Sardina Ramos
On pourrait l'espérer, ce sont les devoirs...
et
en supposant que vous n'êtes pas autorisé à toucher la déclaration de l'Objet.
OriginalL'auteur ackb