Comment naviguer dans un vecteur en utilisant des iterators? (C ++)

L’objective est d’accéder à l’élément “nth” d’un vecteur de chaînes au lieu de l’opérateur [] ou de la méthode “at”. D’après ce que j’ai compris, les iterators peuvent être utilisés pour naviguer dans des conteneurs, mais je n’ai jamais utilisé d’iterators auparavant et ce que je lis est déroutant.

Si quelqu’un pouvait me donner des informations sur la manière d’y parvenir, je l’apprécierais. Je vous remercie.

Vous devez utiliser la méthode begin et end de la classe vector , qui renvoie respectivement l’iterator faisant référence au premier et au dernier élément.

 using namespace std; vector myvector; // a vector of stings. // push some ssortingngs in the vector. myvector.push_back("a"); myvector.push_back("b"); myvector.push_back("c"); myvector.push_back("d"); vector::iterator it; // declare an iterator to a vector of ssortingngs int n = 3; // nth element to be found. int i = 0; // counter. // now start at from the beginning // and keep iterating over the element till you find // nth element...or reach the end of vector. for(it = myvector.begin(); it != myvector.end(); it++,i++ ) { // found nth element..print and break. if(i == n) { cout<< *it << endl; // prints d. break; } } // other easier ways of doing the same. // using operator[] cout< 

Typiquement, les iterators sont utilisés pour accéder aux éléments d’un conteneur de manière linéaire; cependant, avec les “iterators à access aléatoire”, il est possible d’accéder à n’importe quel élément de la même manière que l’ operator[] .

Pour accéder à des éléments arbitraires dans un vec vectoriel , vous pouvez utiliser les éléments suivants:

 vec.begin() // 1st vec.begin()+1 // 2nd // ... vec.begin()+(i-1) // ith // ... vec.begin()+(vec.size()-1) // last 

Voici un exemple de modèle d’access classique (versions antérieures de C ++):

 int sum = 0; using Iter = std::vector::const_iterator; for (Iter it = vec.begin(); it!=vec.end(); ++it) { sum += *it; } 

L’avantage de l’utilisation de l’iterator est que vous pouvez appliquer le même modèle à d’autres conteneurs :

 sum = 0; for (Iter it = lst.begin(); it!=lst.end(); ++it) { sum += *it; } 

Pour cette raison, il est vraiment facile de créer un code modèle qui fonctionne de la même manière, quel que soit le type de conteneur . Un autre avantage des iterators est qu’ils ne supposent pas que les données résident dans la mémoire; Par exemple, on pourrait créer un iterator direct capable de lire des données à partir d’un stream d’entrée ou générant simplement des données à la volée (par exemple, un générateur de plages ou de nombres aléatoires).

Une autre option avec std::for_each et lambdas:

 sum = 0; std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; }); 

Depuis C ++ 11, vous pouvez utiliser auto pour éviter de spécifier un nom de type très long et compliqué de l’iterator vu auparavant (ou même plus complexe):

 sum = 0; for (auto it = vec.begin(); it!=vec.end(); ++it) { sum += *it; } 

De plus, il existe une variante plus simple pour chaque variante:

 sum = 0; for (auto value : vec) { sum += value; } 

Et enfin, il y a aussi std::accumulate où vous devez faire attention si vous ajoutez des nombres entiers ou à virgule flottante.

Les iterators de Vector sont des iterators à access aléatoire, ce qui signifie qu’ils ont l’apparence de simples pointeurs.

Vous pouvez accéder au nième élément en ajoutant n à l’iterator renvoyé par la méthode begin() du conteneur, ou vous pouvez utiliser operator [] .

 std::vector vec(10); std::Vector::iterator it = vec.begin(); int sixth = *(it + 5); int third = *(2 + it); int second = it[1]; 

Sinon, vous pouvez utiliser la fonction avance qui fonctionne avec tous les types d’iterators. (Vous devriez vous demander si vous voulez vraiment effectuer un “access aléatoire” avec des iterators à access non aléatoire, car cela peut être coûteux à faire.)

 std::vector vec(10); std::vector::iterator it = vec.begin(); std::advance(it, 5); int sixth = *it; 

En C ++ – 11 vous pouvez faire:

 std::vector v = {0, 1, 2, 3, 4, 5}; for (auto i : v) { // access by value, the type of i is int std::cout << i << ' '; } std::cout << '\n'; 

Voir ici pour les variantes: https://en.cppreference.com/w/cpp/language/range-for