Je peux créer un tableau et l'initialiser comme ceci:
int a[] = {10, 20, 30};
Comment puis-je créer un std::vector
et l'initialiser de la même manière élégante?
La meilleure façon que je connaisse est:
std::vector<int> ints;
ints.push_back(10);
ints.push_back(20);
ints.push_back(30);
Y a-t-il une meilleure façon?
c++
vector
stl
initialization
Agnel Kurian
la source
la source
tr1::array
est utile car les tableaux ordinaires ne fournissent pas l'interface des conteneurs STLRéponses:
Une méthode consisterait à utiliser le tableau pour initialiser le vecteur
la source
static
ouconst
, mais ils expliquent tous les deux comment il doit être utilisé et permettent au compilateur d'effectuer des optimisations supplémentaires.Si votre compilateur prend en charge C ++ 11, vous pouvez simplement faire:
Ceci est disponible dans GCC à partir de la version 4.4 . Malheureusement, VC ++ 2010 semble être à la traîne à cet égard.
Alternativement, la bibliothèque Boost.Assign utilise la magie non macro pour permettre ce qui suit:
Ou:
Mais gardez à l'esprit que cela a des frais généraux (en gros,
list_of
construit unstd::deque
sous le capot), donc pour un code critique pour les performances, vous feriez mieux de faire comme Yacoby le dit.la source
this->vect = {};
:?std::vector<T> vector;
std::vector<int> v = {1, 2, 3, 4};
, des vecteursinitializer list constructor
seront appelés pour ce type d'initialisation, son doc peut être trouvé dans laC++ 11
section .Si vous le pouvez, utilisez la méthode moderne C ++ [11,14,17, ...]:
L'ancienne façon de boucler sur un tableau de longueur variable ou d'utiliser
sizeof()
est vraiment terrible pour les yeux et complètement inutile en termes de surcharge mentale. Beurk.la source
En C ++ 0x, vous pourrez le faire de la même manière que vous l'avez fait avec un tableau, mais pas dans la norme actuelle.
Avec uniquement la prise en charge des langues, vous pouvez utiliser:
Si vous pouvez ajouter d'autres bibliothèques, vous pouvez essayer boost :: assignation:
Pour éviter de coder en dur la taille d'un tableau:
la source
int another[size_of_array(array)]
alors que vous pouvez le faireint another[ARRAY_SIZE(array)]
.sizeof
expression qui n'a pas besoin d'une définition. Bien que vous puissiez réellement fournir une définition, le faire correctement nécessiterait l'allocation statique d'un tableau et le renvoi d'une référence à celui-ci, et la question suivante serait ce qui aurait du sens en tant que valeurs pour le tableau? (Notez également que cela signifie un tableau par combinaison type / taille des instanciations de la fonction!) Étant donné que ce n'est pas une utilisation sensée, je préfère l'éviter.En C ++ 11:
Utilisation de boost list_of:
Utilisation de boost assign:
STL conventionnel:
STL conventionnel avec macros génériques:
STL conventionnel avec une macro d'initialisation vectorielle:
la source
std::begin
etstd::end
pour tableau, de sorte qu'un vecteur peut également être initialisé commestatic const int arr[] = {10,20,30}; vector<int> vec(begin(arr), end(arr));
.Je pensais juste jeter mes 0,02 $. J'ai tendance à déclarer ceci:
dans un en-tête d'utilitaire quelque part et tout ce qui est requis est:
Mais je ne peux pas attendre C ++ 0x. Je suis bloqué car mon code doit également être compilé dans Visual Studio. Huer.
la source
const T (&data)[N]
partie? Comment la taille du tableau est-elle déduite dans votre appelmakeVector(values)
?Avant C ++ 11:
Méthode 1 =>
Méthode 2 =>
C ++ 11 ci-dessous est également possible
la source
Commençant par:
Si vous n'avez pas de compilateur C ++ 11 et que vous ne souhaitez pas utiliser boost:
Si vous n'avez pas de compilateur C ++ 11 et pouvez utiliser boost:
Si vous avez un compilateur C ++ 11:
la source
Pour l'initialisation vectorielle -
peut être fait si vous avez un compilateur c ++ 11.
Sinon, vous pouvez avoir un tableau de données, puis utiliser une boucle for.
En dehors de ceux-ci, il existe plusieurs autres façons décrites ci-dessus en utilisant du code. À mon avis, ces méthodes sont faciles à mémoriser et rapides à écrire.
la source
La façon la plus simple de le faire est:
la source
Je construis ma propre solution en utilisant
va_arg
. Cette solution est compatible C ++ 98.Démo
la source
Si votre compilateur prend en charge les macros Variadic (ce qui est vrai pour la plupart des compilateurs modernes), vous pouvez utiliser la macro suivante pour transformer l'initialisation vectorielle en une ligne:
Avec cette macro, vous pouvez définir un vecteur initialisé avec un code comme celui-ci:
Cela créerait un nouveau vecteur d'entiers nommé my_vector avec les éléments 1, 2, 3, 4.
la source
Si vous ne souhaitez pas utiliser boost, mais souhaitez profiter de la syntaxe comme
il suffit d'inclure ce morceau de code
la source
((((v+=1),2),3),4),5)
Voici comment cela fonctionne: tout d'abord,vector<T> += T
renvoie un vecteur_inserter permet de l'appelervi
qui encapsule le vecteur d'origine, puis d'vi,T
ajouter T au vecteur d'origine quivi
encapsule et de le retourner lui-même afin que nous puissionsvi,T
recommencer.En C ++ 11:
la source
vector<int> arr = {10, 20, 30};
.vous pouvez le faire en utilisant boost :: assign.
détail ici
la source
+=
qu'il y a 1,2,3,4 .. à la fin des valeurs, ou ajoute- t-il 1 au 1er élément, 2 au 2e élément, 3 au 3e élément (comme une syntaxe comme celle-ci devrait dans MATLAB- comme les langues)Une question en double plus récente a cette réponse par Viktor Sehr . Pour moi, il est compact, visuellement attrayant (on dirait que vous `` enfoncez '' les valeurs dans), ne nécessite pas c ++ 11 ou un module tiers, et évite d'utiliser une variable supplémentaire (écrite). Voici comment je l'utilise avec quelques modifications. Je peux passer à l'extension de la fonction de vector et / ou va_arg dans le futur intead.
la source
Les méthodes ci-dessous peuvent être utilisées pour initialiser le vecteur en c ++.
int arr[] = {1, 3, 5, 6}; vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));
vector<int>v; v.push_back(1); v.push_back(2); v.push_back(3);
etcvector<int>v = {1, 3, 5, 7};
Le troisième est autorisé uniquement en C ++ 11.
la source
Il y a beaucoup de bonnes réponses ici, mais comme je suis arrivé indépendamment avant de lire ceci, j'ai pensé que je jetterais le mien ici de toute façon ...
Voici une méthode que j'utilise pour cela qui fonctionnera universellement sur les compilateurs et les plates-formes:
Créez une structure ou une classe en tant que conteneur pour votre collection d'objets. Définissez une fonction de surcharge d'opérateur pour <<.
Vous pouvez créer des fonctions qui prennent votre structure en paramètre, par exemple:
Ensuite, vous pouvez appeler cette fonction, comme ceci:
De cette façon, vous pouvez créer et transmettre une collection d'objets de taille dynamique à une fonction en une seule ligne épurée!
la source
Si vous voulez quelque chose sur le même ordre général que Boost :: assign sans créer de dépendance sur Boost, ce qui suit est au moins vaguement similaire:
Bien que je souhaite que la syntaxe pour l'utiliser soit plus propre, elle n'est toujours pas particulièrement horrible:
la source
Pour compiler l'utilisation:
la source
la source
Si le tableau est:
la source
Il est assez pratique de créer un vecteur en ligne sans définir de variable lors de l'écriture du test, par exemple:
la source
En relation, vous pouvez utiliser ce qui suit si vous voulez avoir un vecteur complètement prêt à aller dans une déclaration rapide (par exemple, passer immédiatement à une autre fonction):
exemple de fonction
exemple d'utilisation
mais faites attention au decltype, assurez-vous que la première valeur correspond clairement à ce que vous voulez.
la source
Il existe différentes façons de coder en dur un vecteur, je vais partager quelques façons:
la source
"Comment créer un vecteur STL et l'initialiser comme ci-dessus? Quelle est la meilleure façon de le faire avec un effort de frappe minimal?"
La façon la plus simple d'initialiser un vecteur lorsque vous avez initialisé votre tableau intégré est d'utiliser une liste d'initialisation qui a été introduite en C ++ 11 .
ivec a 3 éléments après l'exécution de l'attribution (instruction étiquetée).
la source
B. Stroustrup décrit une belle façon de chaîner des opérations dans 16.2.10 Selfreference à la page 464 dans l'édition C ++ 11 du Prog. Lang. où une fonction renvoie une référence, ici modifiée en vecteur. De cette façon, vous pouvez enchaîner
v.pb(1).pb(2).pb(3);
mais peut être trop de travail pour de si petits gains.la source
La manière la plus simple et la plus ergonomique (avec C ++ 11 ou version ultérieure):
la source
Au cas où vous voudriez l'avoir dans votre propre classe:
la source