将对象添加到地图时,std :: make_pair是否正在创建副本?

时间:2019-03-27 23:07:41

标签: c++ dictionary

我的问题是我想添加一些东西来映射:

我不知道std make pair是否正在创建对象的副本?它仅应将指针添加到映射,并应创建long64 SOR的副本。 我正在使用指针,因为引用无法正常工作!

typedef std::map<SOR, kPartBase*> Partlist; //the map

void kFixedConstruct::push_part(kPartBase& part)
{
    Parts.insert(std::make_pair<SOR, kPartBase*>(static_cast<long64>(part.SorID), &part)); //Is this like really inserting the pointers to the originals or is it creating a copy?
}

1 个答案:

答案 0 :(得分:1)

将有您的数据的多个副本。要查看所有内容,请将其分解为单个步骤。

首先,我们根据您的两个值创建一个对:

std::pair<SOR, kPartBase*> first(static_cast<long64>(part.SorID), &part);

然后,由于这不是map::insert的正确类型,我们将它们再次复制到另一个变量:

std::pair<const SOR, kPartBase*> second(first);

因为map :: value_type具有const键值。可以通过使用

来避免此副本
Partlist::value_type(static_cast<long64>(part.SorID), &part)

代替make_pair。这对(second)将被复制到您的地图中。

或者您可以使用

Parts.emplace(static_cast<long64>(part.SorID), &part);

(或try_emplace),并避免将值放入地图所需的副本(除了副本之外)。