std::map, pointeur de carte de la valeur de la clé, est-ce possible?
std::map<std::string, std::string> myMap;
std::map<std::string, std::string>::iterator i = m_myMap.find(some_key_string);
if(i == m_imagesMap.end())
return NULL;
string *p = &i->first;
Est la dernière ligne est-elle valide?
Je veux stocker ce pointeur p d'ailleurs, il sera valable pour l'ensemble du programme de la vie?
Mais ce qui va arriver si j'ai ajouter un peu plus d'éléments de la carte (avec d'autres touches) ou de supprimer certaines autres touches, n'est-ce pas réaffecter cette chaîne (paire clé-valeur), de sorte que la p ne sera pas valide?
- réponse courte: probablement PAS, réponse longue: il ne se compile pas, sauf si vous avez déjà utilisé
typedef const std::string string;
au lieu deusing namespace std;
qui est assez déroutant...
Vous devez vous connecter pour publier un commentaire.
D'abord, les cartes sont garantis pour être stable; c'est à dire les itérateurs ne sont pas invalidées par l'élément d'insertion ou de suppression (à l'exception de l'élément est supprimé de cours).
Toutefois, la stabilité de l'itérateur ne garantit pas la stabilité de pointeurs! Bien qu'il arrive souvent que la plupart des implémentations utilisent des pointeurs - au moins à un certain niveau pour mettre en œuvre les itérateurs (ce qui signifie qu'il est assez sûr de supposer que votre solution fonctionne), ce que vous devriez vraiment magasin est l'itérateur lui-même.
Ce que vous pourriez faire est de créer un petit objet comme:
Et puis stockez-la au lieu d'un pointeur de chaîne.
Section 23.1.2#8 (conteneur associatif exigences):
Donc oui stocker des pointeurs vers les données membres d'un élément de la carte est garanti pour être valide, sauf si vous supprimez que élément.
Si vous n'êtes pas sûr des opérations entraînera l'annulation de votre itérateurs, vous pouvez le retrouver assez facilement dans le référence. Par exemple pour vecteur::insert il dit:
carte::insert sur l'autre main ne mentionne rien de la sorte.
Comme Pierre l'a dit, vous devez stocker l'itérateur plutôt que le pointeur, mais.
Pourquoi souhaites-tu le faire?
Vous ne pouvez pas modifier la valeur de *p, puisque c'est const std::string. Si vous n'avez changer, alors vous pourriez casser les invariants du conteneur en changeant l'ordre de tri des éléments.
Sauf si vous avez d'autres exigences que vous n'avez pas donné ici, alors vous devriez prendre juste une copie de la chaîne.