定义其中包含结构的地图

时间:2011-06-09 13:29:29

标签: c++ stl map struct

我有像

这样的结构
struct category {
    int id,newID;
    std::string name;
};

之类的地图
std::map<std::string, category> categories;

将详细信息插入地图是否安全,如

category x = {1,2,"Name"};
category y = {2,3,"Mike"};
categories["FIRST"]=x;
categories["SECOND"]=y;

或者我应该声明地图

std::map<std::string, category*> categories;

并制作结构指针并插入它?哪个更安全?

6 个答案:

答案 0 :(得分:2)

你更安全的意思是什么?两种方法都很好。使用第二种方式时,必须确保删除类别对象。在第一个删除地图时,它们会自动删除。

如果你需要传递很多物体,那么第一个就会慢一些,因为你要制作副本。第二个就是复制指针。

因此,您需要决定哪一个符合您的需求。

答案 1 :(得分:1)

如果您的意思是资源泄漏的安全性,在您的特定示例中,第一个变体是完全安全的。

如果使用指针,您可能希望在堆上创建实例,这意味着手动内存管理,这很容易出错。

第二个解决方案可能具有的唯一问题(就安全性而言)是对象需要是可复制的。如果对象手动管理任何资源,则必须确保正确实现了copy-constructor和assignment-operator。

答案 2 :(得分:1)

如果没有更多背景,你的问题就无法得到解答。

一个天真的答案可能是“插入结构本身更安全,因为您不必担心内存泄漏”。但是,这样的答案并不令人满意。

要获得更好的答案,您必须考虑以下几个因素:

  1. 你的struct应该是可复制的吗?换句话说,在您的应用程序域中,是否有相同结构的多个副本?如果没有,你应该使用指针。
  2. 您的struct目前的形式是可复制的,并且具有深层复制语义。是否有可能在将来添加会导致深层复制语义中断的成员?如果是这样,你将被迫以这种或那种方式处理。这与前一项有关,因为struct的可复制性和复制语义会影响您的决定。
  3. 您的map可能有很多条目吗?它可能有很多条目,其中键不同但值不是?在这种情况下,使用指针将节省内存。

答案 3 :(得分:0)

那很好[你的第一个例子]。这就是你应该怎么做的。

当你真的必须时,你应该只引入间接和动态分配[你的第二个例子],因为那时你必须管理对象的生命周期并且它更容易出错。

答案 4 :(得分:0)

我会将类别对象包装在智能指针中并存储智能指针。它不像存储整个对象那么重,允许访问真实对象,并会自动清理它自己。

答案 5 :(得分:0)

以下是关于如何使此代码更安全的说明:

  1. 我会为struct category创建一个构造函数:

    struct category {
        category( int id, int newID, const std::string& name) : 
            id(id), newID(newID), name(name) {}
        int id,newID;
        std::string name;
    };
    

    例如,通过更改结构中idnewID的顺序,您就有机会不破坏代码。现在,您可以将其初始化为categories["FIRST"]=category(1, 2, "Name");

  2. 我会使用智能指针而不是普通指针:

    std::map<std::string, boost::shared_ptr<category> > categories;
    
  3. std::map<std::string, category>也可以,但它会复制category个对象。如果它们足够大,这可能是性能问题。