Le but est d'accéder au "nième" élément d'un vecteur de chaînes au lieu de l'opérateur [] ou de la méthode "at". D'après ce que je comprends, les itérateurs peuvent être utilisés pour naviguer dans les conteneurs, mais je n'ai jamais utilisé d'itérateurs auparavant, et ce que je lis est déroutant.
Si quelqu'un pouvait me donner des informations sur la façon d'y parvenir, je l'apprécierais. Je vous remercie.
Réponses:
Vous devez utiliser la méthode
begin
andend
de lavector
classe, qui renvoie l'itérateur faisant référence respectivement au premier et au dernier élément.la source
std::vector
a des itérateurs à accès aléatoire.std::advance(it, n)
. Il est défini pour faire exactement ce que vous voulez, et il l'utilisera automatiquementit + n
si l'itérateur est étiqueté comme à accès aléatoire, ou fera la boucle s'il le faut.En règle générale, les itérateurs sont utilisés pour accéder aux éléments d'un conteneur de manière linéaire; cependant, avec des "itérateurs à accès aléatoire", il est possible d'accéder à n'importe quel élément de la même manière que
operator[]
.Pour accéder à des éléments arbitraires dans un vecteur
vec
, vous pouvez utiliser ce qui suit:Voici un exemple de modèle d'accès typique (versions antérieures de C ++):
L'avantage d'utiliser iterator est que vous pouvez appliquer le même modèle avec d'autres conteneurs :
Pour cette raison, il est vraiment facile de créer un code de modèle qui fonctionnera de la même manière quel que soit le type de conteneur . Un autre avantage des itérateurs est qu'ils ne supposent pas que les données résident en mémoire; par exemple, on pourrait créer un itérateur avant qui peut lire des données à partir d'un flux d'entrée, ou qui génère simplement des données à la volée (par exemple un générateur de plage ou de nombres aléatoires).
Une autre option utilisant
std::for_each
et lambdas:Depuis C ++ 11, vous pouvez utiliser
auto
pour éviter de spécifier un nom de type très long et compliqué de l'itérateur comme vu précédemment (ou même plus complexe):Et, en plus, il existe une variante plus simple pour chaque variante:
Et enfin, il y a aussi
std::accumulate
là où vous devez faire attention si vous ajoutez des nombres entiers ou flottants.la source
En C ++ - 11, vous pouvez faire:
Voir ici pour les variations: https://en.cppreference.com/w/cpp/language/range-for
la source
7.5.0
sur Ubuntu 18.04 et fonctionne de la même manière pour les tableaux.Les itérateurs de Vector sont des itérateurs à accès aléatoire, ce qui signifie qu'ils ressemblent à des pointeurs simples.
Vous pouvez accéder au nième élément en ajoutant n à l'itérateur renvoyé par la
begin()
méthode du conteneur , ou vous pouvez utiliser operator[]
.Vous pouvez également utiliser la fonction avancée qui fonctionne avec toutes sortes d'itérateurs. (Vous devez vous demander si vous voulez vraiment effectuer un "accès aléatoire" avec des itérateurs à accès non aléatoire, car cela pourrait être une chose coûteuse à faire.)
la source
advance
pour des itérateurs à accès aléatoire, ou des itérateurs de catégorie inconnue, car il est garanti de fonctionner en temps constant dans ce cas. C'est pourquoi les itérateurs définis par l'utilisateur doivent être correctement balisés.advance
c'est vraiment ennuyeux à utiliser (à cause de l'utilisation du paramètre out) si vous savez que vous avez affaire à des itérateurs à accès aléatoire. Je ne le recommanderais que dans du code générique, et s'il n'est pas beaucoup utilisé (si l'algorithme ne prend pas bien en charge les itérateurs à accès non aléatoire, qu'il en soit ainsi - par exemple,std::sort
pourrait trier unstd::list
mais ce n'est pas le cas car ce serait ridiculement inefficace ).operator+
. Mais la question concernait explicitement le vecteur, il n'y a donc rien de mal avec la première partie de votre réponse. J'ai juste pensé que la deuxième partie pourrait impliquer "vous ne pouvez pas utiliser l'avance avec des itérateurs à accès aléatoire, même si vous le souhaitez" à quelqu'un qui n'a jamais vuadvance
auparavant.Vector
devrait être en minusculesVoici un exemple d'accès à l'
ith
index d'un enstd::vector
utilisant unstd::iterator
dans une boucle qui ne nécessite pas d'incrémenter deux itérateurs.Sans boucle for
et en utilisant la
at
méthode:la source