Comment initialiser un vecteur stl des objets qui ont eux-mêmes non-trivial constructeurs?
supposons que j'ai la classe suivante:
class MyInteger {
private:
int n_;
public:
MyInteger(int n) : n_(n) {};
//MORE STUFF
};
Et supposons que cette classe n'ont pas un défaut trivial constructeur MyInteger()
. Je doit toujours fournir une int
de l'initialiser pour une raison quelconque. Et puis, supposons que quelque part dans mon code j'ai besoin d'un vector<MyInteger>
. Comment initialiser chaque MyInteger
composant dans ce vector<>
?
J'ai deux situations (probablement la solution est la même, mais je vais dire quand même), une variable normale à l'intérieur d'une fonction:
int main(){
vector<MyInteger> foo(10); //how do I initialize each
//MyInteger field of this vector?
doStuff(foo);
}
et que les données dans une classe:
class MyFunClass {
private:
vector<MyInteger> myVector;
public:
MyFunClass(int size, int myIntegerValue) : myVector(size) {};
//what do I put here if I need the
//initialization to call MyInteger(myIntegerValue) for all
//components of myVector?
};
Est-il possible de le faire simplement dans la liste d'initialisation ou dois-je écrire l'initialisation à la main dans le MyFunClass(int, int) constructeur?
Cela semble donc très basique, et pourtant j'ai un peu raté mon livre et ne peut pas trouver dans le web.
- Si le entier être le même pour toutes les instances à l'intérieur du vecteur?
- C'est assez bon. Je veux juste savoir comment initialiser le vecteur. Le code réel où ce doute est apparu n'est pas exactement cela. Je voulais juste un simple code avec le même problème.
- Dans mon code j'ai un vecteur de graphiques et d'une classe est une collection de graphes, et je suis en utilisant un
vector<Graph>
comme un conteneur. Le problème est que le nombre de graphes dans la collection doit être la même que la taille des Graphes, donc je dois passer à la courbe constructeur de la mêmeint
je passe à l'vecteur constructeur.
Vous devez vous connecter pour publier un commentaire.
Il existe de nombreuses façons d'y arriver. Voici certains d'entre eux (dans aucun ordre particulier de présence).
Utilisation
vector(size_type n, const T& t)
constructeur. Il initialise un vecteur d'n
des copies det
. Par exemple:Pousser éléments dans le vecteur, un par un. Cela peut être utile lorsque les valeurs doivent être différents. Par exemple:
Une autre option est le constructeur de liste d'initialisation, si C++0x est une option:
Bien sûr, il y a une option pour fournir constructeur par défaut et/ou d'utiliser autre chose que
std::vector
.Espère que cela aide.
MyStuff () : values{ {1}, {2}, {3} } {}
Si les éléments du vecteur sont pas par défaut constructible, puis il ya certaines choses que vous ne peut pas faire avec le vecteur. Vous ne pouvez pas écrire ceci (exemple 1):
Vous pouvez, cependant, écrire ceci (exemple 2):
(Cela nécessite seulement un constructeur de copie.) Le second argument est un initialiseur pour les éléments du vecteur.
Dans votre cas, vous pourriez également écrire:
...depuis MyInteger a un non-explicite constructeur prenant "int" comme argument. Ainsi, le compilateur en fonte 37 à MyInteger(37) et de donner le même résultat que l'exemple 2.
Vous pourriez vouloir étudier la documentation sur les std::vector.
En plus de toutes les réponses qui ont répondu à la question très bien, dans un cas que votre classe MyInteger n'est pas de copier-constructible, vous pouvez utiliser cette astuce : au lieu de créer
vector< MyInteger>
, vous pouvez créervector< shared_ptr< MyInteger > >
Initialisation des listes peut être utilisée sans référence à des objets sous-jacents.
de sortie: 2 2 deux