【问题标题】:c++ stl map storage and memory usagec++ stl map存储和内存使用
【发布时间】:2013-07-17 15:12:09
【问题描述】:

我知道在插入新条目时,stl map 将复制构造并存储值,而不是指针或引用。

但是,我对以下示例代码感到困惑:

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

为什么我改变了地图的值,地图的大小却没有改变?

【问题讨论】:

    标签: c++ map stl storage


    【解决方案1】:

    首先,如果 size 是指映射中的条目数,则需要使用 m.size() 而不是 sizeof(m)。后者测量std::map 对象的大小(以字节为单位),这不是实际条目的存储位置。因此,无论您添加多少条目,该大小都不会改变。

    其次,您的代码实际上并未向地图添加任何新条目。它只会将条目添加到地图中的一些向量in

    【讨论】:

    • 感谢您的回复。据我了解,stl map 存储值而不是指针。即,当将某个对​​象分配给映射时,它将调用复制构造函数在映射中创建一个对象。但是sizeof(m)=>48,但是sizeof(m[1])=>24,也就是说sizeof(m)比sizeof(m[1])*m.size()小很多。这让我认为“m”存储指针而不是真正的向量。
    • @Chao 从某种意义上说,这两种说法都是正确的。是的,它存储了一个指针(因为它必须:向量的大小会随着您添加和删除元素而改变)。但是该指针不是指向您传递的原始向量的指针。 Map 复制该向量,然后(基本上)存储指向该副本的指针。(顺便说一下,向量在内部做了类似的事情:sizeof(m[1]) 无论如何都不会改变您添加到向量中的许多元素,因为向量本身仅包含一个指向单独的、动态分配的存储的指针,这是元素所在的位置)。
    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2015-01-15
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    相关资源
    最近更新 更多