J'ai un itérateur d'un std::list<std::string>
, mais quand j'essaye de l'avancer en utilisant +=
, j'obtiens une erreur de compilation.
Le code est:
#include <list>
#include <iostream>
#include <string>
int main() {
std::list<std::string> x;
x.push_front("British");
x.push_back("character");
x.push_front("Coding is unco");
x.push_back("Society");
x.push_back("City Hole");
auto iter = x.begin();
iter += 3;
//std::advance(iter, 3);
x.erase(iter);
for (auto &e: x) {
std::cout << e << "\n";
}
}
Si je compile ceci en utilisant clang++ -std=c++11 -o li li.cpp
, j'obtiens:
li.cpp:13:10: error: no viable overloaded '+='
iter += 3;
~~~~ ^ ~
1 error generated.
Pourquoi ne puis-je pas utiliser +=
avec cet itérateur?
2 réponses
Un std::list::iterator
n'est pas un Random Access Iterator. Il n'est pas possible de "sauter" plusieurs éléments dans une liste, vous devez parcourir la liste jusqu'à ce que vous atteigniez l'élément souhaité. Vous pouvez utiliser std::advance
qui en déduira la meilleure façon d'avancer l'itérateur basé sur la catégorie d'itérateur. Dans le cas d'un std::list::iterator
, il incrémentera l'itérateur dans une boucle.
La raison est simplement que l'opérateur +=
n'est pas défini pour l'itérateur bidirectionnel que vous utilisez.
Pour tous les itérateurs, il y a au moins:
- Copiable et destructible, c'est-à-dire
X b(a);
etb = a;
- Peut être incrémenté, c'est-à-dire
++a
eta++
Tout le reste dépend du type d'itérateur, consultez le tableau ici:
Comme vous le voyez, un itérateur à accès aléatoire ferait l'affaire.
Questions connexes
De nouvelles questions
c++
C ++ est un langage de programmation à usage général. Il a été conçu à l'origine comme une extension de C et a une syntaxe similaire, mais c'est maintenant un langage complètement différent. Utilisez cette balise pour les questions sur le code (à être) compilé avec un compilateur C ++. Utilisez une balise spécifique à la version pour les questions liées à une révision standard spécifique [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] ou [C ++ 23], etc. .