2011-09-04 2 views
2

Comment renvoyer correctement et efficacement une paire d'une paire nouvellement insérée à une carte?Comment retourner une paire de référence d'une paire nouvellement insérée (à une carte)?

inline pair<unsigned int, T> *createObj(unsigned int UID){ 
    static pair<unsigned int, T> ret; 

    objList.insert(pair<unsigned int, T>(UID, T())); 

    if (UID_Counter <= UID) 
     UID_Counter = UID+1; 
    ret = make_pair(UID, objList.find(UID)->second); 
    return &ret; 
} 

Les rendements ci-dessus un objet à utiliser, mais tout ce que je change dans ret ne change pas dans la « vraie paire » dans la carte ...

Fondamentalement, ce que je veux réaliser est:

  1. Insérer un nouveau objet Z en carte A
  2. (-class "enfant") Changer les choses dans e e retourné objet Z
  3. Dans chaque cycle de mise à jour, itérer à travers les objets carte A et utiliser les données réelles chargées dans objet "A Z" lors de la mise à jour ...
+0

Vos exigences sont très peu claires. Lorsque vous insérez dans une carte, vous obtenez (via un peu d'indirection) une référence à l'objet inséré, donc ce n'est pas un problème. Pouvez-vous décrire vos objectifs un peu plus clairement? –

+0

Mes objectifs sont simplement de retourner une ** paire ** référence à la carte nouvellement insérée ** ** – Alexander

+0

Je vois. Je pense que Luc t'a déjà trié. Lisez attentivement le manuel de 'std :: map', son interface implique beaucoup de paires dans des endroits inhabituels. –

Répondre

4

La surcharge particulière de insert que vous utilisez renvoie un std::pair<iterator, bool>. En particulier, le premier membre de cette paire est un itérateur de l'élément nouvellement inséré ou de l'élément déjà présent. Ainsi:

pair<const unsigned int, T>& 
createObj(unsigned int UID) 
{ 
    auto inserted = objList.insert(pair<unsigned int, T>(UID, T())); 

    if (UID_Counter <= UID) 
     UID_Counter = UID+1; 

    return *inserted.first; 
} 

Notez que je retourne une référence où vous reveniez un pointeur et que le type de clé est const unsigned int, pas unsigned int. Vous pouvez aussi utiliser map_type::value_type (où map_type est le type de votre conteneur). Si vous vous demandez pourquoi votre code ne fonctionnait pas, c'est que vous stockiez une copie de l'objet mappé à l'intérieur de ret, donc toute modification via le pointeur que vous avez retourné n'affecterait que cette copie.

+0

Merci! Fondamentalement, j'ai prévu le problème avec retour "ret" au lieu d'un élément réel de la carte ... mais maintenant j'ai quelque chose à travailler avec. :) – Alexander

+0

Quel est le point de la conditionnelle? 'UID' est une variable locale qui n'a aucun effet. –

+0

Cependant, pour une raison quelconque, j'obtiens une «indirection illégale» pointant sur '* inserted.first', en utilisant votre exemple de code ... – Alexander

Questions connexes