2016-06-16 25 views
-1

Wenn wir ein map<int,int> erstellen, können wir es löschen, aber es bleibt immer noch im Speicher, oder? Z.B.Wie kann ich eine Map zerstören und einen Map-Zeiger in C++ füllen?

#include <map> 
using namespace std; 

int main(){ 

    map<int,int> myMap; 
    myMap[1] = 2; 
    myMap.clear(); 

return 0; 
} 

Aber wenn wir einen Zeiger anstelle der tatsächlichen map gesetzt, konnte ich es zerstören mit delete, aber ich konnte die Karte die gleiche Art und Weise nicht füllen:

#include <map> 
using namespace std; 

int main(){ 

    map<int,int> *myMap = new map<int,int>; 
    // myMap[1] = 2; 
    delete myMap; 

return 0; 
} 

uncommenting die myMap[1] = 2; Linienenden up mit dem Fehler:

[email protected]:~$ g++ test.cpp test.cpp: In function ‘int main()’: test.cpp:8:14: error: no match for ‘operator=’ (operand types are ‘std::map’ and ‘int’) myMap[1] = 2; ^ In file included from /usr/include/c++/5/map:61:0, from test.cpp:2: /usr/include/c++/5/bits/stl_map.h:296:7: note: candidate: std::map<_Key, _Tp, _Compare, _Alloc>& std::map<_Key, _Tp, _Compare, _Alloc>::operator=(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = int; _Tp = int; _Compare = std::less; _Alloc = std::allocator >] operator=(const map& __x) ^ /usr/include/c++/5/bits/stl_map.h:296:7: note: no known conversion for argument 1 from ‘int’ to ‘const std::map&’

Wie destruct ich ein map in C++? Ist es "zerstörbar"?

Wie initialisiere ich auch die Werte eines map<> Zeigers?

+3

'(* myMap) [1] = 2; 'macht den Trick, wenn Sie 'neu' verwenden. Der Rest ist in CinCout Antwort unter – GMichael

+1

Gleicher Grund 'int * i = new int (0); i + = 5; delete i; 'fügt dem' int' nicht 5 hinzu. – immibis

+0

* "Wenn wir eine' map 'erstellen, können wir sie löschen, aber sie bleibt immer noch im Speicher, richtig?" *, Das Kartenverwaltungsobjekt selbst (das ist wahrscheinlich ein oder zwei Dutzend Byte, je nachdem, ob Sie es sind) Kompilieren einer 32-Bit- oder 64-Bit-App und ob die "Map" -Implementierung Daten zur Unterstützung des Debugging hinzugefügt hat, aber der Speicher für die Datenelemente, die zum Speichern verwendet werden, wird zur Wiederverwendung durch die Anwendung freigegeben. Zusammenfassend ist es sehr selten wert, mehr als ein 'clear' auf einer' map' zu machen. Dies steht im Gegensatz zu "Vektor", der dazu neigt, in dem Speicher zu hängen, in dem Elemente früher gespeichert wurden. –

Antwort

3

How do I destruct a map in C++?

Wenn Sie es als ein Objekt (erster Fall) erklären, es zerstört wird, wenn es den Gültigkeitsbereich verlässt.

Wenn es als Zeiger deklariert wird, funktioniert das Schlüsselwort delete, wenn new verwendet wird. Wenn intelligente Zeiger verwendet werden, müssen Sie nicht explizit delete aufrufen.

How do I initialize/populate the values of a map<> pointer?

Verwenden Sie die insert() Methode, wie folgt aus:

#include <map> 
using namespace std; 

int main(){ 

    map<int,int> *myMap = new map<int,int>; 
    myMap->insert(make_pair<int, int>(1, 2)); 
    delete myMap; 

return 0; 
} 

Oder, wie von @ Michael vorgeschlagen, Sie (*myMap)[1] = 2; verwenden können, aber ich ziehe es mit Hilfe der API.

HINWEIS: Wie in den Kommentaren erwähnt, operator[] und insert() für eine std::map sind nicht in Bezug auf das Verhalten ähnlich. Es ist nur so, dass sie in diesem minimalen Beispiel keinen Unterschied widerspiegeln.

+0

'insert' und' operator [] 'haben nicht dieselbe Semantik. – juanchopanza

+0

^Und wie wirkt sich das in diesem Zusammenhang aus? – CinCout

+0

Indem Sie dieses entscheidende Detail auslassen, schlägt Ihre Antwort vor, dass sie gleichwertig sind und nicht. – juanchopanza

0

Es gibt eine Reihe von Möglichkeiten, wie Sie den Speicher freigeben können, den ein std::map verwendet (auf das anfängliche Minimum), ohne Zeiger zu verwenden.

Zunächst ist die idiomatische klar und minimieren (Swap), wodurch eine leere temporäre Karte erstellen und Swap seinen Inhalt mit Ihrem Arbeits Karte:

std::map<int,int>().swap(myMap); // memory reset to minimum 

Die andere Methode ist es, den Umfang der steuern die Karte mit einem internen Bereich { und }.

int func() 
{ 
    { // <- start an internal scope for the map 

     std::map<int,int> myMap; 

     // use the map 

    } // <- let the map go out of scope when done using it 

    // carry on without the map 
} 

Wenn Sie müssen einen Zeiger verwenden (am besten vermieden werden), dann müssen Sie dereferenzieren den Zeiger mit * wie so:

(*myMap)[key] = value;