我有一个
map<std::string, std::vector<string>> myMap
,它是班级成员。该地图应该在对象创建后通过 2 个步骤来填充。由于地图的大小未知,因此我没有在类的构造函数中初始化它。我正在做的事情如下:
//Step1
//Just adding the keys to the map
if(condition)
myMap[strCondition];
//do something
//do something else
//Step2
//Adding the values to the keys
std::vector<std::string> tokens;
//tokens get filled
if(anotherCondition)
myMap[strCondition].insert(myMap[strCondition].end(), tokens.begin(), tokens.end());
这是正确且有效的方法吗?由于
myMap
值(std::vectors)不存在,因此步骤 1 和步骤 2 之间访问 myMap
键值对的某些代码是否会导致程序崩溃?另外,我可以摆脱步骤 1,因为步骤 2 无论如何都会将密钥添加到地图(如果它尚不存在)。
你所做的或多或少是正确的,但是存在不必要的低效率根源。你多次查找
myMap[strCondition]
,而一次就足够了:
std::vector<T>* p = nullptr;
if(condition)
p = &myMap[strCondition];
// ...
if(anotherCondition) {
p = p == nullptr ? &myMap[strCondition] : p;
// since C++23
p->append_range(tokens);
// until C++23
p->insert(e->end(), tokens.begin(), tokens.end());
}