L'initialisation de std::vector de std::string

Tout en travaillant dans un projet avec un code existant, j'ai trouvé cette fonction:

std::vector<std::string> Object::getTypes(){
    static std::string types [] = {"type1","type2", "type3"};
    return std::vector<std::string> (types , types +2);
}

J'aurais probablement écrit ceci:

std::vector<std::string> Object::getTypes(){
    std::vector<std::string> types;
    types.push_back("type1");
    types.push_back("type2");
    types.push_back("type3");
    return types;
}

Est-ce qu'un choix de style ou est-il quelque chose que je suis absent? Toute aide serait grandement appréciée. Désolé si c'est trop basique.

Mise à jour:
En fait trouvé les différentes classes qui remplacent la même méthode de le faire d'une façon ou l'autre, donc C'est encore plus ambiguë. Je ferait tout de même, mais préférez la meilleure approche, si il y en a un.


Modifier

Veuillez noter que l'héritage de code est incorrect, car il initialise le vecteur avec seulement les deux premiers éléments de la matrice. Cependant, cette erreur a été discuté dans les commentaires, et devrait donc être préservée.

L'initialisation correcte aurait dû se lire comme suit:

...
    return std::vector<std::string> (types, types + 3);
...
La première incantation pourrait, en principe, être plus efficace, car elle ne comporte pas de mémoire ré-allocations. Il y a aussi moins d'appels de fonction. Remarque en C++11, vous pouvez dire return std::vector<std::string>{"type1","type2", "type3"};.
Aussi, dans cette version, l'isolement de code et de données est de plus en plus apparente, il est donc syntaxiquement plus propre.
Correction à mon commentaire précédent: en C++11, vous pouvez l'atteindre en moins de mots: return {"type1","type2", "type3"};.
La première version est la plus sujette à erreur, comme l'a démontré par le tout-en-un erreur ici.
Pas si vous utilisez std::begin et std::end (ce qui devrait, bien sûr).

OriginalL'auteur Andres Bucci | 2013-12-17