gpt4 book ai didi

c++ - 添加和初始化新 std::map 元素的最有效方法是什么?

转载 作者:行者123 更新时间:2023-11-28 04:26:48 24 4
gpt4 key购买 nike

比如说,如果我有以下 map ,其中每个元素都包含一个数组:

struct STRUCT{
int value;
std::vector<MY_DATA> myArr;
};

std::map<UINT, STRUCT> myMap;

然后如果我想向该 map 添加一个新元素并同时对其进行初始化:

//But, let's say we have a 'STRUCT' with a large number of items in the vector
std::vector<MY_DATA> arr;
arr.resize(0x10000); //Arbitrary
int val = 123;

addToMap(&arr, val);

据我了解,我有以下方法可以做到这一点:

void addToMap1(UINT id, std::vector<MY_DATA>* pArr, int val)
{
//Method 1
STRUCT myStruct;
myStruct.myArr = *pArr;
myStruct.value = val;
myMap[id] = myStruct;
}

void addToMap2(UINT id, std::vector<MY_DATA>* pArr, int val)
{
//Method 2
myMap[id] = STRUCT();
STRUCT* pS = &myMap[id];
pS->myArr = *pArr;
pS->value = val;
}

void addToMap3(UINT id, std::vector<MY_DATA>* pArr, int val)
{
//Method 3
myMap[id] = STRUCT();
std::map<UINT, STRUCT>::iterator itr = myMap.find(id);
STRUCT* pS = &itr->second;
pS->myArr = *pArr;
pS->value = val;
}

void addToMap4(UINT id, std::vector<MY_DATA>* pArr, int val)
{
//Method 4
std::pair<std::map<UINT, STRUCT>::iterator, bool> prNew =
myMap.insert(std::pair<UINT, STRUCT>(id, STRUCT()));
ASSERT(prNew.second); //It must have not existed before!
STRUCT* pS = &prNew.first->second;
pS->myArr = *pArr;
pS->value = val;
}

但最有效的方法是什么?

最佳答案

如果您的意图是覆盖映射中已经存在的键的现有数据,那么就简单

void addToMap(UINT id, const std::vector<MY_DATA>* pArr, int val)
{
STRUCT &pS = myMap[id];
pS.value = val;
pS.myArr = *pArr;
}

会非常有效地完成这个技巧。目前尚不清楚为什么在您现有的“方法”中您坚持首先将默认构造的 STRUCT() 保存到 myMap[id] 中。这是完全没有必要的。

其他优化机会包括:

  1. 从现有 vector 移动数据而不是复制它(如果可能)
  2. 甚至不构造源 vector ,直接在映射中构造目标 vector (如果可能的话)
  3. 如果源 vector 需要作为一个独立的对象存在(并且是长期存在的),那么指向该 vector 的指针可以存储在映射中而不是完整的拷贝

但是从你的描述中不清楚这是否适用于你的情况。


请注意,您不能为此目的使用 emplace,因为在这种情况下 emplace 不会执行您想执行的操作:它不会覆盖现有 key 的数据。在这种情况下,我们需要的是 insert_or_assign 的转发版本,可惜它不存在。

关于c++ - 添加和初始化新 std::map 元素的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54101181/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com