2013-07-17 5 views
1

Я понял, что при вставке новой записи stl-карта копирует конструкцию и сохраняет значение вместо указателя или ссылки.C++ хранилище stl-памяти и использование памяти

Однако, я смущен в следующем примере кода:

int main(int argc, char** argv){ 
    map<int, vector<int> > m; 
    for(int i=0;i<10; i++){ 
     m[i] = vector<int>(); 
    } 
    cout<<sizeof(m)<<endl; 
    cout<<m[1].size()<<endl; 
    for(map<int, vector<int> >::iterator it=m.begin(); it!=m.end(); it++){ 
     it->second.push_back(1); 
     it->second.push_back(1); 
     it->second.push_back(1); 
    } 
    cout<<sizeof(m)<<endl; 
    cout<<m[1].size()<<endl 
} 

Выходы

48 
0 
48 
3 

Почему размер карты не меняется, даже если я меняю значение карты ?

ответ

5

Во-первых, если по размер вы имеете в виду количество записей в карте, вам нужно использовать m.size(), а не sizeof(m). Последний измеряет размер (в байтах) объекта std::map, который не находится там, где хранятся фактические записи. Таким образом, размер не изменится, независимо от того, сколько записей вы добавляете.

Во-вторых, ваш код на самом деле не добавляет никаких новых записей на карту. Он добавляет только некоторые из векторов в карте.

+0

Спасибо за ваш ответ. Насколько я понял, stl map хранит значение вместо указателя. т. е. при назначении некоторого объекта карте, он будет вызывать конструктор копирования для создания объекта на карте. Однако sizeof (m) => 48, но sizeof (m [1]) => 24, что означает, что sizeof (m) намного меньше sizeof (m [1]) * m.size(). Это заставляет меня думать, что «m» хранит указатель вместо истинного вектора. – Chao

+0

@Chao Оба утверждения истинны, в некотором смысле. Да, он хранит указатель (потому что он должен: размер вектора будет меняться при добавлении и удалении элементов). Но этот указатель не является указателем на исходный вектор, который вы передали. ** Карта делает копию этого вектора, а затем (в основном) хранит указатель на эту копию. ** (Вектор, между прочим, делает нечто подобное внутри: 'sizeof (m [1])' не изменится независимо от того, сколько элементов вы добавляете к вектору, потому что сам вектор содержит только указатель на отдельное динамически распределенное хранилище, в котором находятся элементы). – jogojapan

+0

Спасибо. Очень хорошо объяснено. – Chao

Смежные вопросы