2016-06-16 3 views
-1

Если мы создадим map<int,int>, мы можем его очистить, но он все еще остается в памяти, не так ли? Например.Как разрушить карту и заполнить указатель карты в C++?

#include <map> 
using namespace std; 

int main(){ 

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

return 0; 
} 

Но если мы устанавливаем указатель вместо фактического map, я мог бы уничтожить его с delete, но я не мог заполнить карту на один и тот же путь:

#include <map> 
using namespace std; 

int main(){ 

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

return 0; 
} 

раскомментирован myMap[1] = 2; концы линии с ошибкой:

[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&’

Как самоуничтожению в C++ в map? Разве это «разрушительно»?

Также, как инициализировать/заполнить значения указателя map<>?

+3

'(* MyMap) [1] = 2; 'делает трюк, если вы используете' new'. Остальное находится в ответе CinCout ниже – GMichael

+1

По той же причине 'int * i = new int (0); i + = 5; delete i; 'не добавляет 5 в' int'. – immibis

+0

* «Если мы создадим карту ', мы можем ее очистить, но она по-прежнему остается в памяти, верно? »* Сам объект управления картой (который, вероятно, один или два десятка байтов, в зависимости от того, компилируя 32-битное или 64-битное приложение и добавляя ли добавление данных «map» к поддержке отладки), но память для элементов данных, которую хранит «карта», будет выпущена для повторного использования приложением. В общем, очень редко стоит делать больше, чем «ясно» на «карте». Это контрастирует с «вектором», который имеет тенденцию зависать в памяти, где хранятся элементы. –

ответ

3

How do I destruct a map in C++?

Когда вы объявляете его как объект (первый случай), он уничтожается, когда он выходит из сферы действия.

Если объявлено как указатель, ключевое слово delete использует трюк, если используется new. Если используются интеллектуальные указатели, нет необходимости явно вызывать delete.

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

Используйте метод insert(), как это:

#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; 
} 

Или, как это было предложено @Michael, вы можете использовать (*myMap)[1] = 2; Но я предпочитаю использовать API.

ПРИМЕЧАНИЕ. Как указано в комментариях, operator[] и insert() для std::map не являются схожими с точки зрения поведения. Просто в этом минимальном примере они не отражают никакой разницы.

+0

'insert' и' operator [] 'не имеют одинаковой семантики. – juanchopanza

+0

^И как это влияет в этом контексте? – CinCout

+0

Опуская эту важную деталь, ваш ответ предполагает, что они эквивалентны, а это не так. – juanchopanza

0

Существует несколько способов освобождения памяти: std::map использует (до своего первоначального минимума), не прибегая к указателям.

Во-первое это идиоматическое ясно и минимизировать (своп), в котором вы создаете пустую временную карту и свопа его содержимое с вашей рабочей картой:

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

Другой методом является контролировать объем карта с использованием внутреннего объема { и }.

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 
} 

Если вы должны использовать указатель (лучше избегать), то вам нужно разыменовать указатель с помощью * так:

(*myMap)[key] = value; 
Смежные вопросы