正确初始化字符串和向量的映射

问题描述 投票:0回答:1

我有一个

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 无论如何都会将密钥添加到地图(如果它尚不存在)。

c++ memory vector data-structures insert
1个回答
0
投票

你所做的或多或少是正确的,但是存在不必要的低效率根源。你多次查找

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());
}
© www.soinside.com 2019 - 2024. All rights reserved.