2010-06-25 10 views
0

J'essaie actuellement d'apprendre à utiliser efficacement la partie STL de C++. Supposons qu'il y ait 2 vecteurs de même type de longueur égale qui doivent être transformés en un autre vecteur de même longueur en appliquant un opérateur, y a-t-il un bon moyen de le faire en utilisant la fonctionnalité de la STL?Application d'une fonction à 2 vecteurs stl

Voici quelques pseudo-code pour ce que je suis en train de faire:

vector<T> a; 
vector<T> b; 
vector<T> result; 

for (int i = 0; i < a.size(); ++i){ 
    result.at(i) = a.at(i) op b.at(i); 
} 

où « op » est un certain opérateur qui est défini pour le type T.

+0

Vous avez raison d'apprendre à utiliser des algorithmes de STL, C++ 0x (et lambdas) vont probablement populariser leur utilisation. –

+0

Bon à entendre car je pense qu'apprendre le STL est crucial pour acquérir des compétences en C++. – shuttle87

Répondre

8

Vous devrez peut-être vérifier les tailles, mais vous pouvez généralement utiliser std::transform.

E.g. (Pour +-<functional> contient des modèles de classe pour les objets de fonction pour cela et d'autres opérateurs binaires)

std::transform(a.begin(), a.end(), b.begin(), result.begin(), std::plus<T>()); 

Vous devez vous assurer que b.size() >= a.size() et result.size() >= a.size(). Si result commence vide, vous pouvez utiliser un back_insert_iterator pour le remplir sans avoir à redimensionner le conteneur.

+0

C'est exactement le genre de solution que je cherchais. Dans ce cas, le résultat commence comme vide, quelle est la syntaxe correcte pour l'utilisation de back_insert_iterator? – shuttle87

+0

Ok, je pense que je l'ai compris, #include puis utilisez: std :: transformer (a.begin(), a.end(), b.begin(), retour_inserter (résultat), std :: plus ()); Merci pour la bonne réponse! – shuttle87

+0

@ shuttle87: Oui, je pense que vous avez raison. –

0

Ok, je peux me tromper, mais:

réponse courte: non

longue réponse: peut-être devrait être fait quelque chose d'intelligent à ce sujet, mais l'écriture du code en boucle est beaucoup plus facile à lire.

Cela me rappelle le problème suivant:

« donné un vecteur x et un vecteur y de même taille, éléments permuter de x et y en même temps tel que y est triée selon certains prédicat »

que je ne pouvais pas résoudre en utilisant un algorithme STL directement (sauf avec des classes itératives ad hoc, peut-être génériques, mais écrire un tri rapide était beaucoup plus facile - c'est pourquoi j'ai une relation amour-haine avec C++)

Questions connexes