gpt4 book ai didi

c++ - 哪种形式更适合用于 map

转载 作者:行者123 更新时间:2023-12-04 07:16:08 25 4
gpt4 key购买 nike

给定一个类Ac和一张 map :

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 )返回 pairbool指示是否发生插入以及元素的迭代器。 ret.first->second.first可能有点困惑。 ret.first是映射中元素的迭代器 ret.first->secondAc该元素的一部分和 ret.first->second.first是它的 first成员。
在编译器优化之后,这可能与您的两个版本中的任何一个一样有效,但我认为使用 emplace 更清楚当你想插入一个元素时,因为 Ac 的构造比较便宜,不看 map 随便搭临时也不错。要真正确定哪个性能更好,您需要对其进行测量。一般情况下, std::unordered_map可以预期会更快,因为它的元素没有根据键排序。

关于c++ - 哪种形式更适合用于 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68747201/

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