Comment faire pour modifier un élément vectoriel en C++?
J'ai un vecteur de structures en C++ et je voudrais modifier chaque élément individuellement. J'ai constaté que le fait de SomeStruct info = myVector[i]
me donne une copie de l'élément, donc si je le modifie rien ne sera changé. Donc maintenant je suis à la réinitialisation de l'élément comme ça: myVector[i] = info
. Est-il un moyen plus efficace? Celui qui ne pourront donner lieu à une opération de copie?
C'est mon code actuel:
struct CharacterInfo {
QChar character;
int occurrences;
double frequency;
};
std::vector<CharacterInfo> characterInfos;
//Some code to populate the vector
for (unsigned i = 0; i < characterInfos.size(); i++) {
CharacterInfo info = characterInfos[i];
info.frequency = (double)info.occurrences / (double)totalOccurrences;
characterInfos[i] = info; //how to avoid this?
}
OriginalL'auteur laurent | 2011-11-23
Vous devez vous connecter pour publier un commentaire.
La manière la plus simple qui ne change pas trop de votre code, c'est juste pour utiliser une référence à la place d'une instance. Donc:
La prochaine plus simple est de passer de l'utilisation d'une boucle, avec un index, et donc comme:
Avec la STL, vous pouvez aller encore plus loin, en particulier si vous avez un C++11 est capable de compilateur, par exemple:
Pas liée à votre question directement, mais si vous ajouter une méthode à la structure qui calcule la fréquence, le code devient beaucoup plus propre, par exemple à la suite de ce dernier exemple, vous pourriez faire:
Cela permettra également de travailler sans un compilateur C++11 si vous modifiez les appels à
std::begin(myVector)
avecmyVector.begin()
et de même pour la fin.OriginalL'auteur Daemin
Vous pouvez utiliser une référence:
La référence
info
est lié à l'élément du vecteur. Si vous en changez, vous changerle vecteur élément de trop.
OriginalL'auteur Gunther Piez
Vous pourriez parcourir le vecteur avec une STL itérateur:
Dans la boucle,
it
est un itérateur qui a essentiellement la même fonctionnalité et l'interface comme un pointeur vers unCharacterInfo
struct: http://cplusplus.com/reference/std/iterator/RandomAccessIterator/En boucle avec un itérateur est le plus idiomatique à la manière d'une itération à travers chaque élément d'une
std::vector
si vous n'avez pas besoin de connaître l'index de chaque élément.OriginalL'auteur David Hu
Je ne suis pas sûr de comprendre votre question, mais je pense que vous essayez de faire cela?
Une autre option serait d'utiliser des itérateurs:
OriginalL'auteur GWW