2017-03-14 2 views
0

Supposons que j'ai cette classe:En C++, comment puis-je créer un nouvel objet pour chaque élément d'un vecteur?

class dog 
{ 
    public: 
     //dogstuff 
    private: 
     //secret dogstuff 
}; 

et j'ai une fonction qui recherche par quelque chose sans rapport et me fait un nombre inconnu de noms de chien:

dogNamesVector = getListOfDogNames(); 

Ainsi, le liste des noms de chiens pourrait être quelque chose comme "Spike, Spot, George, Shadow, ect ..".

Y at-il une façon intelligente d'aller ensuite:

dog DOGNAME() 

et obtenir un tas d'objets dog que je peux appeler et utiliser avec la liste des noms de chiens?

+0

Vous pouvez itérer sur votre vecteur de noms de chiens et créer une instance 'dog' pour chaque nom, en stockant éventuellement ces instances dans un vecteur différent. Peut-être cherchez-vous ['std :: transform'] (http://en.cppreference.com/w/cpp/algorithm/transform)? Il parcourt une plage, en ajoutant une valeur différente à une autre plage. –

+0

C'est une bonne idée! Mais y aurait-il un moyen de les appeler par leur nom? Un peu comme un dictionnaire en python? – driedupsharpie

+2

'std :: map ' ou 'std :: unordered_map ' –

Répondre

-1
std::vector<dog> dogs = get_dogs(); 
std::vector<std::string> dog_names; 

dog_names.reserve(dogs.size()); 

std::transform(std::begin(dogs), std::end(dogs), std::back_inserter(dog_names), [](auto const& dog) { return dog.name(); }); 
+0

Certaines explications (même les commentaires dans le code) au lieu du code seulement "réponse" sois utile. – zett42

0

Alors, disons que vous avez un vecteur de chiens:

vector<dog> dogs {...}; 

Et nous supposons qu'il ya déjà des chiens dans ce vecteur. Cela signifie que vous avez déjà des objets de chien de type et de les appeler, tout ce que vous devez faire est d'utiliser la notation de support:

dogs[i]; 

Si vous voulez attribuer ce chien à un autre objet, vous utilisez :

dog spike = dogs[i]; 

Si vous voulez un nom unique (clé ou identifiant) vous inclure dans la classe elle-même, en tant que tel:

private: 
     string dog_name; 

et pour accéder à cela, vous feriez une fonction membre (o r 'méthode'). Combinez n'importe laquelle de ces étapes avec une forme de boucle (n'importe quelle forme d'itération suffira) et vous pouvez créer autant d'objets de chien que nécessaire, et vous pouvez également créer une fonction de recherche par nom si cela peut vous aider.

0

Si vous avez une liste de chaînes, et votre classe dog peut être construit avec une chaîne en entrée, vous pouvez construire un vecteur de dog objets à l'aide itérateurs à la liste de chaînes, par exemple:

class dog 
{ 
public: 
    dog(const std::string name) : m_name(name) {} 
private: 
    std::string m_name; 
}; 

std::vector<std::string> dogNames = getListOfDogNames(); 

std::vector<dog> dogs(dogNames.begin(), dogNames.end()); 

Demo