2 votes

Peut-on initialiser un vector<string *> directement sans new ?

Je suis en train d'apprendre le C++/la programmation générale et j'expérimente parfois les fonctionnalités du C++11 tout en faisant des exercices écrits pour l'ancienne norme.

Cet exercice fait intervenir un vecteur de pointeurs sur des chaînes de caractères.

#include <vector>
#include <string>
#include <iostream>
int main()
{
    using std::string ;
    using std::vector ;
    using std::cout ;
    using std::endl ;

    vector<string *> v = {new string("Hello") , new string("World")} ;
    for (string * x : v) {
        cout << *x << " " ;
        delete x ;
    }
    cout << endl ;
}

J'ai eu un peu de mal à comprendre comment utiliser la liste d'initialisation avec ce vecteur, mais cela semble fonctionner.

Cette version fonctionne également :

    //...
    string s1 = "Hello" ;
    string s2 = "World" ;
    vector<string *> v = {&s1 , &s2} ;
    for (string * x : v)
        cout << *x << " " ;
    //...

C'est plus propre, et d'après ce que j'ai appris jusqu'à présent, cela semble être la meilleure solution.

Mais je me demande s'il existe un autre moyen d'initialiser le vecteur sans créer les chaînes de caractères à l'avance ou sans avoir à les supprimer. Ce que j'ai lu suggère que la liste {} devrait être utilisable universellement.

Et pour ce que ça vaut, cela donne une erreur plutôt catastrophique :

vector<string *> v = {"Hello" , "World"} ;

12voto

Nawaz Points 148870

Pourquoi utilisez-vous std::string* en premier lieu ? Avez-vous une raison pour cela ? Je ne pense pas.

Utilisez ça :

std::vector<std::string> v{"Hello" , "World"};

Maintenant, vous n'avez pas besoin d'utiliser new . De telles classes sont conçues précisément parce que vous pourriez éviter d'utiliser new vous-même.

Notez également qu'il n'y a pas de '=' entre 'v' y '{' dans l'initialisation ci-dessus. Cette initialisation est appelée initialisation uniforme introduite par C++11. Plus d'exemples ici .

3voto

Bo Persson Points 42821

Mais je me demande : existe-t-il un autre moyen d'initialiser le vecteur sans créer les chaînes de caractères à l'avance ou sans avoir à utiliser la fonction de suppression ?

Non, pour stocker les pointeurs vers quelque chose vous devez avoir cette chose stockée ailleurs. Sinon, il n'y aura pas d'endroit vers lequel le pointeur pourra pointer.

Le fait que ça semble étrange est probablement dû au fait que est une façon inhabituelle de stocker des chaînes de caractères. Si ce n'était pas un exercice (artificiel), vous pourriez utiliser un fichier std::vector<std::string>> et vous débarrasser de vos problèmes.

0voto

James Mitch Points 518

Comme l'a dit Nawaz, pourquoi s'embêter à utiliser des pointeurs sur des chaînes de caractères ? Juste pour le plaisir d'utiliser l'opérateur -> ? Créez une classe qui a quelques variables privées et renvoyez-les en utilisant des références. C'est un meilleur exemple de quand utiliser l'opérateur flèche.

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