49 votes

Utilisez le mot-clé auto dans C++ STL

J'ai vu du code qui utilise le vecteur,

 vector<int>s;
s.push_back(11);
s.push_back(22);
s.push_back(33);
s.push_back(55);
for (vector<int>::iterator it = s.begin(); it!=s.end(); it++) {
    cout << *it << endl;
}

C'est pareil que

 for (auto it = s.begin(); it != s.end(); it++) {
    cout << *it << endl;
}

L'utilisation du mot-clé auto est-elle sûre dans ce cas ? Et si le type de vecteur est float ? string ?

66voto

user1234567 Points 1002

Il s'agit d'informations supplémentaires et non d'une réponse.

En C++11, vous pouvez écrire :

 for (auto& it : s) {
    cout << it << endl;
}

à la place de

 for (auto it = s.begin(); it != s.end(); it++) {
    cout << *it << endl;
}

Il a le même sens.

Mise à jour : Voir aussi le commentaire d'@Alnitak.

55voto

UncleBens Points 24580

Le mot-clé auto demande simplement au compilateur de déduire le type de la variable de l'initialisation.

Même un compilateur pré-C++0x sait quel est le type d'une expression (d'initialisation), et le plus souvent, vous pouvez voir ce type dans les messages d'erreur.

 #include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int>s;
    s.push_back(11);
    s.push_back(22);
    s.push_back(33);
    s.push_back(55);
    for (int it=s.begin();it!=s.end();it++){
        cout<<*it<<endl;
    }
}

Line 12: error: cannot convert '__gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, __gnu_norm::vector<int, std::allocator<int> > >, __gnu_debug_def::vector<int, std::allocator<int> > >' to 'int' in initialization

Le mot- clé auto vous permet simplement de tirer parti de cette connaissance - si vous (compilateur) connaissez le bon type, choisissez simplement pour moi !

14voto

Karel Petranek Points 10740

Le mot-clé auto obtient le type de l'expression à droite de =. Par conséquent, cela fonctionnera avec n'importe quel type, la seule exigence est d'initialiser la variable auto lors de sa déclaration afin que le compilateur puisse en déduire le type.

Exemples:

 auto a = 0.0f;  // a is float
auto b = std::vector<int>();  // b is std::vector<int>()

MyType foo()  { return MyType(); }

auto c = foo();  // c is MyType

3voto

Kirill V. Lyadvinsky Points 47627

auto est destiné à être utilisé dans une telle situation, il est absolument sûr. Mais malheureusement, il n'est disponible qu'en C++0x, vous aurez donc des problèmes de portabilité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X