C++11 Gamme à base de boucle d'efficacité “auto const &i” et “auto i”
En C++11, je peux effectuer une itération sur certains conteneurs de la sorte:
for(auto i : vec){
std::cout << i << std::endl;
}
Mais je sais que cette inutilement - inutilement, puisque je n'ai besoin de impression les valeurs de vec
- fait une copie de (MODIFIER: chaque élément de) vec
, donc à la place je pourrais faire:
for(auto &i : vec){
std::cout << i << std::endl;
}
Mais je veux faire en sorte que les valeurs de vec
ne sont jamais modifiés et de respecter const-correctness, alors je peux le faire:
for(const auto &i : vec){
std::cout << i << std::endl;
}
Donc ma question est: Si j'ai seulement besoin de look les valeurs de certains conteneur, ne serait pas la dernière boucle (const auto &i
) toujours être préféré en raison de l'augmentation de la effieciency de ne pas avoir une copie supplémentaire du (MODIFIER: chaque élément de) vec
?
J'ai un programme que je suis en plein développement dans lequel j'envisage de procéder à ce changement tout au long, car l'efficacité est essentielle en elle (la raison pour laquelle je suis à l'aide de C++ à l'endroit de poing).
- Oui, si vous avez seulement besoin d'un accès en lecture à un argument, il devrait être à travers
auto const&
pour éviter une inutile copie. - Le mot clé "const n'est pas de rendre votre code plus vite que...
for (auto i : vec)
ne pas rendre une copie supplémentaire de l'ensemble de lavec
, la copie de chaque élément devec
eni
.- Je vois. Donc, à chaque nouvelle itération, la copie précédente est supprimée, droit?
- Oui, c'est correct.
- pas supprimés, mais qui a été détruit.
Vous devez vous connecter pour publier un commentaire.
Oui. La même raison, si vous avez seulement jamais lu un argument vous rendre le paramètre
const&
.Ceux qui sont vos "valeurs par défaut". Lorsque
T
est un type fondamental (built-in), bien que, en général, vous simplement revenir àconst T
(pas de référence) pour la lecture, car une copie est moins cher que l'aliasing.const T&
. En général, ce que vous voulez, et il est inutile effort visant à modifier pour "const T
" ou tout simplement "T
" quand vous connaissezT
; le compilateur va faire de ce droit pour vous.const auto&
vous signaler votre intention de ne pas modifier quoi que ce soit et que vous n'aurez pas besoin d'une copie soit. Même si le rendement est le même je voudrais aller avec cela, car il rend votre code plus expressif.Imaginez si votre vecteur contient des chaînes de caractères. Les chaînes longues. 5000 chaînes longues. Copie inutilement et vous vous retrouvez avec un joliment écrit pour la boucle qui est terriblement inefficace.
Assurez-vous que votre code suit votre intention. Si vous n'avez pas besoin d'une copie à l'intérieur de la boucle, ne pas en faire un.
Utiliser une référence & comme suggéré ci-dessus, ou des itérateurs.