将元素添加到Boost unordered_map

时间:2014-04-07 18:47:13

标签: c++ c++11 boost unordered-map

关于具有以下声明的unordered_map:

typedef struct
{
    unsigned int length;
    unsigned type;
    std::string data;
} packet;

boost::unordered::unordered_map<int, packet> map;

当我向该地图添加一个对象时,unordered_map将克隆该对象并将其附加到其容器中。 所以我的问题是,有一个指向结构的指针而不是将其添加为对象更好吗?

如果我有一个原始指针作为unordered_map中的值,是否有任何方法我应该遵循以保持对象在内存中存活并且其位置不被其他变量使用,即使我离开函数范围?

3 个答案:

答案 0 :(得分:2)

如果您希望避免副本,则应使用std::unordered_map及其emplace成员函数。

一般情况下不要存储指针:你可能会略微加快你的一些代码,但如果甚至是瓶颈,那么权衡更复杂的代码和增加的风险错误。还有很多你不需要的解引用。

如果您认为需要,可以随意分析所有三个选项。

答案 1 :(得分:1)

将指针存储在任何容器中的问题是您需要手动管理存储在容器中的对象的生命周期。也就是说,如果执行以下操作,容器的析构函数将不会自动释放动态分配的内存。

boost::unordered::unordered_map<int, packet *> map;
map.insert(std::make_pair(1, new packet()));

要解决此问题,您可以执行以下操作。

boost::unordered::unordered_map<int, std::shared_ptr<packet>> map;
map.insert(std::make_pair(1, std::make_shared<packet>()));

注意:代码需要额外的工作才能编译。

答案 2 :(得分:1)

如果选择存储指针,则必须在堆上分配对象,以便在离开作用域时使对象保持活动状态。那么你应该让容器保持智能指针(std::unique_ptr?)而不是原始指针。

如前所述,如果您的容器包含objets,请使用emplace来避免复制。