2016-04-11 1 views
0

Ma carte est définie comme ceci:touche d'effacement, la valeur de la carte par la valeur en C++

map<string, map<string, string>> _map; 

Mais le problème qui a été soulevée est que la première est essentiellement la même valeur de ma carte, à savoir

_map["key1"]["value1"] = "data1"; 
_map["key1"]["value2"] = "data2"; 
_map["key1"]["value3"] = "data3"; 
_map["key1"]["value4"] = "data4"; 
_map["key2"]["value5"] = "data5"; 

Alors, quand je veux supprimer tout particulier (clé, valeur), Je ne peux pas utiliser _map.find (« key1 ») pour le iterator, car il a des entrées en double.

Existe-t-il un moyen de définir l'index de l'itérateur en utilisant la valeur?

Supposons que je veuille supprimer cette entrée:

_map["key1"]["value4"] = "data4"; 

Comment puis-je faire cela?

+0

Votre question n'est pas claire. Il semble que vous demandiez comment supprimer un élément d'une carte, ce qui est trivial à trouver dans la documentation. Pourriez-vous préciser quel est le problème que vous essayez de résoudre? – juanchopanza

+0

Vous ne pouvez pas avoir plus d'une valeur par clé dans une carte. –

+0

@ A.Franzen: il n'a pas plus d'une valeur par clé. regarder attentivement! – Nawaz

Répondre

2

La réponse de Nawaz est correcte. Il a cependant une faiblesse: Si vous effacez "value5", _map["key2"] contiendra toujours un map<string, string> vide. Ce n'est probablement pas ce que vous avez l'intention de faire.

Pour résoudre ce problème, vous pouvez utiliser le modèle pair et de modifier le type de _map être:

map<pair<string, string>, string> _map; 

Vos missions doit ressembler à:

_map[make_pair("key1", "value1")] = "data1"; 
_map[make_pair("key1", "value2")] = "data2"; 
_map[make_pair("key1", "value3")] = "data3"; 
_map[make_pair("key1", "value4")] = "data4"; 
_map[make_pair("key2", "value5")] = "data5"; 

Ensuite, vous pouvez supprimer chaque entrée comme:

_map.erase(make_pair("key1", "value4")); 

Vous pouvez trouver le pair tapez dans l'en-tête <utility>.

+0

Est-ce que ses données seraient toujours organisées dans le même ordre en l'initialisant à votre place au lieu de comment il l'a fait? Demander parce que je ne sais vraiment pas. – Stephen

+0

Oui, ce serait le cas.'std :: pair' définit une comparaison, qui ordonne d'abord par la première coordonnée, puis par la seconde. –

+0

Effacer me donne une erreur. Il ne reconnaît pas le paramètre. Je ne suis pas capable de le supprimer comme ça. J'ai essayé de passer une paire de const également, ne fonctionne toujours pas. –

3

Juste erase il:

_map["key1"].erase("value4"); 

Notez qu'il ne jette pas exception si la clé n'existe pas — il retourne 0 dans ce cas.

BTW, vous pouvez améliorer l'initialisation de la carte comme:

std::map<std::string, std::map<std::string, std::string>> _map 
{ 
    {"key1", { 
       {"value1", "data1"}, 
       {"value2", "data2"}, 
       {"value3", "data3"}, 
       {"value4", "data4"} 
      } 
    }, 
    {"key2", { 
       {"value5", "data5"} 
      } 
    } 
};