【问题标题】:Passing custom class object as a value into STL map将自定义类对象作为值传递到 STL 映射中
【发布时间】:2013-09-24 19:59:47
【问题描述】:

我想将自定义类的对象作为值传递给 STL 映射。我该怎么做..?

这是一个代码:

class demo
{

int a, b,c,d,e;

}

// here is how declare my map:

map<int, demo*> my_map;

这是怎么回事,我在函数中使用它:

demo *ptr = NULL;
ptr = new demo;

这是我插入地图的方式

my_map.insert(make_pair(int, ptr);

// Delete current instance

delete ptr;

这是正确的方法吗..?

【问题讨论】:

    标签: c++ object vector stl reference


    【解决方案1】:

    实际上,没有。如果要将demo 对象存储在map 中,则应使用map&lt;int, demo&gt;。将资源管理留给std::map。另外,使用delete ptr 会破坏刚刚创建的对象,my_map[index] 将是一个无效的指针。

    只需使用my_map.insert(make_pair(myIndex, myDemoObject));

    还要注意,如果不存在,使用my_map[myIndex] 将创建具有给定索引的对象,因此您可以执行以下操作:

    std::map<int, demo> my_map;
    my_map[1].a = 42;
    my_map[2].b = 1337;
    my_map[3].c = 314159;
    my_map[4].d = 23;
    

    【讨论】:

    • 实际上我想创建 4 个新的演示类实例并将其成员的值(即 a、b、c、d、e)分配给 4 个不同的“键”。这就是为什么我调用 delete ptr 以便创建演示类的新实例。
    • 另外,我故意在插入函数后遗漏了一些代码。我只粘贴了代码的相关部分。
    • 另外,我故意在插入函数后遗漏了一些代码。我只粘贴了代码的相关部分。
    • @user2812535:编辑了我的答案。如果你不明白为什么这行得通,你很可能还不明白references。如果是这种情况,您应该看看它们。不管怎样,尽量避免new。如果你想插入一个新的演示,只需预先创建它:demo myDemo; my_map.insert(make_pair(..., myDemo));
    • 您是否注意到 my_map[1] 导致“演示”类析构函数被调用两次? (如果我们在析构函数中删除指针,这可能是一个潜在的问题)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2014-01-21
    • 2018-10-31
    • 2020-10-01
    • 2021-11-07
    相关资源
    最近更新 更多