代码之家  ›  专栏  ›  技术社区  ›  DK2

地图分配中的C++结构

c++
  •  0
  • DK2  · 技术社区  · 4 年前

    正如我所知,映射值由NULL(0)初始化。然而,下面的代码在没有任何分配的情况下运行良好。这个代码是如何工作的?

    #include<bits/stdc++.h>
    using namespace std;
    struct stuc{
        map<string, stuc> mp;
        int cnt;
    }root;
    
    int main() {
        stuc* u = &root;
        stuc* v = &(u->mp["test"]); // how to allocate?
        cout << v->cnt << endl;
        return 0;
    }
    
    0 回复  |  直到 4 年前
        1
  •  3
  •   Jakob Stark    4 年前

    如果你用 [] 接线员喜欢进来吗

    &(u->mp["test"])
    

    如果元素不存在,则会分配一个新的键值对,并进行默认初始化,然后插入到映射中[1]。在你的程序中,这就是发生的事情。地图上还没有密钥 "test" stuc 结构,其所有成员都是默认初始化的( mp = {} 和 cnt = 0 ).这就是你为什么 0 如果你读了 cnt 新创造价值的成员。

    [1] https://en.cppreference.com/w/cpp/container/map/operator_at

        2
  •  1
  •   Odysseus    4 年前

    从您的计算机访问密钥时 std::map 它还不存在,但已插入。

    所以通过访问 mp["test"] 的默认构造实例 struct stuc 为键“test”插入

    考虑下面的示例,当访问非现有密钥时,也会隐式插入一个值,并且其值由默认构造函数设置。

     struct stuc{
        stuc(): cnt(42) { }
        stuc(int c): cnt(c) { }
        int cnt;
    };
    
    int main() {
        map<string, struct stuc> m;
    
        struct stuc s1(1);
    
        m["first"] = s1;
        cout << m["first"].cnt << endl;
        cout << "elements: " << m.size() << endl;
        cout << m["second"].cnt << endl;
        cout << "elements: " << m.size() << endl;
        return 0;
    }
    

    这将输出:

    1
    elements: 1
    42
    elements: 2