J'ai donc écrit un tas de code qui accède aux éléments d'un vecteur stl par index [], mais maintenant je dois copier juste une partie du vecteur. Il ressemble à vector.insert(pos, first, last)
la fonction que je veux ... sauf que je n'ai que le premier et le dernier en tant qu'ints. Existe-t-il un moyen agréable d'obtenir un itérateur pour ces valeurs?
201
Réponses:
Essaye ça:
la source
std::next(v.begin(), index)
manière mentionnée par @dirkgently
( v.begin() + index )
sympa et rapide pour les vecteursmais la manière la plus générique et pour les itérateurs d'accès aléatoire fonctionne aussi à temps constant.
std::advance
( v.begin(), index )
MODIFIER les
différences d'utilisation:
ou
ajouté après les notes @litb.
la source
std::vector
, il est inutile de l'utiliserstd::advance
. Cela ne fait que vous inciter à penser que vous écrivez du code indépendant du conteneur (ce que vous ne faites pas, en pensant aux règles d'invalidation de l'itérateur, aux différentes complexités d'exécution et ainsi de suite). Le seul cas oùstd::advance
cela a du sens est lorsque vous écrivez vous-même un modèle qui ne sait pas de quel type d'itérateur il s'agit.Aussi;
auto it = std::next(v.begin(), index);
Mise à jour: nécessite un compilateur compatible C ++ 11x
la source
Ou vous pouvez utiliser
std::advance
la source
En fait, std :: vector est destiné à être utilisé comme onglet C en cas de besoin. (La norme C ++ demande cela pour l'implémentation des vecteurs, pour autant que je sache - remplacement du tableau dans Wikipedia ) Par exemple, il est parfaitement légal de faire cela, selon moi:
Bien sûr, soit foo ne doit pas copier l'adresse passée en tant que paramètre et la stocker quelque part, soit vous devez vous assurer dans votre programme de ne jamais pousser de nouvel élément dans vec, ou demander de changer sa capacité. Ou risque de faute de segmentation ...
Par conséquent, dans votre exemple, cela conduit à
la source