Obwohl die Adresse s nicht ändert (Variablen, die nicht tun dürfen in C++), wird der Inhalt der Zeichenfolge (zB der Zeiger von s.c_str()) ändern, so vorsichtig sein, beim Spielen mit solchen Sachen.
map<pair<const char*, const char*>, string&> m;
Id ein Konstrukt wie das sehr gefährlich halten, ich zum Beispiel an, dass Sie den Schlüssel suchen Vergleiche basierend auf der Saite, nicht die Lage der Saiten (dh die poitner Werte) erwarten.
Allerdings ignorieren Sie Ihre Wahl des Schlüssels, was Sie tun, mit dem m_tmp Wert ist sicher und gut definiert (das ändert man wird das andere ändern, weil dort die "gleiche" Variable), vorausgesetzt, dass die "Zeichenfolge m_tmp; " Wird der Gültigkeitsbereich nicht überschritten (oder anderweitig gelöscht), und Sie versuchen, über die Karte darauf zuzugreifen (da kein gültiger Speicher mehr referenziert wird).
ZB das Folgende ist nicht sicher.
std::map<int, string &> myMap;
void foo()
{
string s = "Hello World";
myMap[5] = s;
}
int main()
{
foo();
//string s was destroyed when foo() returned, so myMap[5] is no longer a valid reference,
//so it is not defined what will happen here, hopefully an access violation
//rather than some obscure bug because the stack/heap got corrupted
std::cout << myMap[5] << std::end;
}
Es ist auch erwähnenswert, dass man es anders machen kann um wieder vorausgesetzt, dass das Element, das Sie von einer Referenz bekommen nicht gelöscht wird (aber das ist das einzig Mal, ein std :: map erlaubt ist ein ungültig Referenz oder Iterator).
std::map<int,string> myMap;
myMap[5] = "x";
string &s = myMap[5];//get a referecnce
myMap[5] = "Foo";
std::cout << s << std::end;//print Foo
s = "Bar";
std::cout << myMap[5] << std::endl;//print Bar
bereits geändert, dass –
wird dies funktionieren btw: map, string> m; m [Paar ("Foo", "Bar") "String"]; ?? Ich habe gerade bemerkt, dass: Warum shared_ptr. sieht aus wie ein Overkill für mich –
shared_ptr reduziert die Anzahl der Kopien Ihres Objekts auf eins. Es hängt von Ihrem Anwendungsfall ab, ist aber möglicherweise nicht erforderlich.Der Zugriff ist auch schneller, wenn Sie nur einen Zeiger und kein String-Objekt (mit Kopien der zugrunde liegenden Kette) bewegen. Wenn deine Strings kurz sind, ist das wahrscheinlich zu viel. –