给定一个类 Ac
和一个映射:
std::map<std::string, Ac> ma;
以下哪种形式更好:
ma["112"] = Ac(); // (1)
或
Ac ac;
ma["112"] = ac; // (2)
使用版本1有什么问题吗?
上下文中的实际代码:
struct Ac
{
bool first;
bool second;
};
int main()
{
std::map<std::string, Ac> ma;
std::string st = "10.12";
if (ma.find(st) == ma.end())
{
#if 0
// 1
ma["112"] = Ac();
#else
// 2
Ac ac;
ma["112"] = ac;
#endif
}
else
ma[st].first = true;
return 0;
}
最佳答案
我想您不想让成员未初始化,所以让我们提供默认的初始化程序:
struct Ac
{
bool first = false;
bool second = false;
};
接下来,您查找 key 的次数过于频繁。首先,您调用 find
,当找到该元素时,您调用 operator[]
,它必须再次查找该元素。而是使用从 find
返回的迭代器。
关于您的问题,最明显的区别是一个版本添加临时变量的拷贝,而另一个版本插入局部变量的拷贝。如果不需要局部变量,可以调用emplace
就地构造元素:
int main()
{
std::map<std::string, Ac> ma;
std::string st = "10.12";
auto ret = ma.emplace(st,Ac{});
if (! ret.second)
{
ret.first->second.first = true;
}
}
emplace
(类似于 insert
)返回一对 bool
来指示插入是否发生,以及元素的迭代器。 ret.first->second.first
可能有点令人困惑。 ret.first
是映射中元素的迭代器 ret.first->second
是该元素的 Ac
部分, ret.first->second.first
是其 first
成员。
编译器优化后,这可能与您的两个版本中的任何一个版本一样有效,但我认为当您想要插入元素时使用 emplace
更清楚,并且因为 的构造>Ac
比较便宜,不查 map 就搭建临时的也不错。要真正确定什么效果更好,您需要对其进行测量。一般来说,std::unordered_map
预计会更快,因为它的元素没有根据键进行排序。
关于c++ - map 使用哪种形式更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68747201/