Comment ajouter un élément par élément des deux STL vecteurs?
La question est assez stupide, mais j'ai besoin de le faire d'une façon très efficace - il sera effectué à nouveau dans mon code. J'ai une fonction qui retourne un vecteur, et je dois ajouter que les valeurs renvoyées à un autre vectoriel, élément par élément. Très simple:
vector<double> result;
vector<double> result_temp
for(int i=0; i< 10; i++) result_temp.push_back(i);
result += result_temp //I would like to do something like that.
for(int i =0; i< result_temp.size();i++)result[i] += result_temp[i]; //this give me segfault
L'opération mathématique que je suis en train de faire est de
u[i] = u[i] + v[i] pour tout i
Ce qui peut être fait?
Grâce
EDIT: ajout d'une simple initialisation, ce qui n'est pas le point. Comment doit être initialisé?
- Souhaitez-vous poster quelques compilable code? ", cela me donne une erreur de segmentation" n'est pas particulièrement utile, sans voir comment ces vecteurs sont initialisés. Le problème le plus probable est que l'un des vecteurs est plus longue que l'autre. Il est vraiment difficile de dire où votre code n'est pas correct sans voir le code 🙂
- boost.org/doc/libs/1_43_0/libs/numeric/ublas/doc/...
Vous devez vous connecter pour publier un commentaire.
Si vous essayez d'ajouter un
vector
à l'autre, vous pouvez utiliser quelque chose comme ce qui suit. Ces sont l'un de mes utilitaires bibliothèques--deuxoperator+=
surcharges pourstd::vector
: on ajoute un élément unique dans lavector
, l'autre ajoute un ensemble devector
:Si vous essayez d'effectuer une sommation (qui est, de créer un nouveau
vector
contenant la somme des éléments des deux autresvector
s), vous pouvez utiliser quelque chose comme ce qui suit:Vous pourrait également mettre en œuvre un
operator+=
surcharge.Il semble que le problème est l'accès à des valeurs de
result
qui n'existent pas. tzaman montre comment initialiser le résultat à 10 éléments, chacun avec la valeur 0.Maintenant, vous devez appeler le
transform
fonction (de <algorithm>), l'application de laplus
fonction de l'objet (de <fonctionnel>):Ce itère sur
result
etresult_temp
, s'appliqueplus
qui ajoute doubles, et écrit la somme de retour àresult
.Un exemple concret de Jon Reid réponse:
Vous devez initialiser
result
à tous les zéros de la première; il suffit de déclarer la variable n'a pas de répartir les éléments.Essayez ceci:
Si votre code est segfaulting alors que c'est d'une justesse question, pas une efficacité de problème.
Pour atteindre le "u[i] = u[i] + v[i] pour tout i", je le ferais, fondamentalement, ce que vous avez fait:
Si vous vous souciez vraiment de la performance de votre programme (qui est, vous avez écrit une version de base et c'est tellement lent que votre programme est en défaut, dans une certaine mesure, et vous avez prouvé que c'est le code là où la plupart du temps), alors vous pourriez essayer:
Néanmoins, vous n'avez rien à vous soucier de la performance avant que votre code est correct ;-). "Faire fonctionner, faire droit, rendre rapide" est raisonnable devise, bien souvent, vous n'avez pas besoin d'aller aussi loin que l'étape 3.
std::valarray
a en fait exactement leoperator+=
vous le souhaitez. Avant de remplacer tous vos vecteurs avec valarrays, sachez que ne veut pas forcément dire qu'elle est "plus efficace" que d'une simple boucle - je ne sais pas comment sérieusement les responsables de l'implémentation de prendrevalarray
. Vous pouvez toujours regarder la source de la mise en œuvre. Aussi, je ne sais pas pourquoi les données multiples arithmétique des fonctionnalités devalarray
n'était pas défini dans le cadre devector
, mais il y a généralement une raison.Je suis avec @James McNellis - ce code semble correct, tant que
result
etresult_temp
sont de la même longueur.Aussi - pourquoi avez-vous déclaré
result
, mais l'utilisation de la variableresult_v
- est que la façon dont le code est écrit? Si oui, c'est un problèmeLe code semble bien, mais mon premier réflexe serait de modifier n'importe quel code est le remplissage de la forme d'un vecteur de valeurs à ajouter aux valeurs de la première vecteur pour prendre en référence à la première vectoriels et ajouter directement plutôt que de créer un nouveau vecteur qui revient. C'est seulement inefficace.
Si vous ne pouvez pas modifier la fonction de cette façon, peut-être vous pouvez le modifier afin qu'il prenne une référence à un vecteur qui il dégage et puis insère les valeurs en sorte que vous ne sont pas la copie de vecteurs autour. Qui peut être coûteux si vous le faites bien.
Un autre pinailler si vous essayez d'obtenir le plus vite possible, vous devriez utiliser la pré-incrémentation avec les itérateurs plutôt que de la post-incrémentation. Le temporaire qui de post-incrémentation crée ne peut pas être optimisé à l'écart lorsque vous traitez avec des opérateurs surchargés plutôt que de types intégrés. Ainsi, vous gardez la création et la destruction temporaire de chaque itération de la boucle. EDIT: Comme il a été souligné dans les commentaires, vous êtes à l'aide d'indices ici plutôt que de les itérateurs (évidemment je n'étais pas assez d'attention), donc ce conseil ne s'applique pas ici. Toutefois, dans le cas où vous sont utilisation des itérateurs, c'est toujours valide.
Autre que cela, si vous essayez d'ajouter tous les éléments de deux vecteurs en collaboration, ce que vous avez est probablement la plus efficace d'une solution que vous allez obtenir. Il existe de meilleures façons si ce que vous êtes inquiète, c'est d'insérer les éléments d'un vecteur dans un autre, mais si vous êtes juste en ajoutant leurs valeurs, ce que vous avez l'air bon. Je m'attends à ce que l'utilisation de tout algorithmes de la STL serait, au mieux, tout aussi rapide et probablement plus lent en raison supplémentaire d'appels de fonction, mais vous auriez probablement à profil pour être sûr.