Я понял, что при вставке новой записи 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
Почему размер карты не меняется, даже если я меняю значение карты ?
Спасибо за ваш ответ. Насколько я понял, stl map хранит значение вместо указателя. т. е. при назначении некоторого объекта карте, он будет вызывать конструктор копирования для создания объекта на карте. Однако sizeof (m) => 48, но sizeof (m [1]) => 24, что означает, что sizeof (m) намного меньше sizeof (m [1]) * m.size(). Это заставляет меня думать, что «m» хранит указатель вместо истинного вектора. – Chao
@Chao Оба утверждения истинны, в некотором смысле. Да, он хранит указатель (потому что он должен: размер вектора будет меняться при добавлении и удалении элементов). Но этот указатель не является указателем на исходный вектор, который вы передали. ** Карта делает копию этого вектора, а затем (в основном) хранит указатель на эту копию. ** (Вектор, между прочим, делает нечто подобное внутри: 'sizeof (m [1])' не изменится независимо от того, сколько элементов вы добавляете к вектору, потому что сам вектор содержит только указатель на отдельное динамически распределенное хранилище, в котором находятся элементы). – jogojapan
Спасибо. Очень хорошо объяснено. – Chao