gpt4 book ai didi

c++ - 使用 += 运算符是否可以安全地使用 [] 创建新的 std::map 条目?

转载 作者:IT老高 更新时间:2023-10-28 23:09:50 25 4
gpt4 key购买 nike

假设我有一个 std::map<int, int> ,这样做安全吗?

std::map<int, int> m_map;
m_map[0] += 1;

如果 key 0我这样做时 map 中不存在,它怎么知道要添加什么值1去?

我希望 std::map 通过执行 = 来处理这个问题。而不是 +=在值在映射中创建新条目的情况下。这将使我不必这样做:

std::map<int, int>::iterator it = m_map.find(0);
if(it != m_map.end()) {
it->second += 1;
}
else {
m_map[0] = 1;
}

最佳答案

由于先前未映射的键而在调用 operator[] 时插入到映射中的元素是 value-initialized。如果您没有看过该语法,请考虑 () 在以下代码片段中的特殊含义。括号很重要。它们在初始化树中引入了不同于 default-initialization 的旅程。两者都很重要;两者都由语言标准规定。

int i = int();

事实证明,标量(包括指针)的值初始化最终会屈服于零初始化。虽然看起来很奇怪,但前面的代码片段值初始化了一个 int 的实例,由于 int 是一个标量,它变成了零初始化,然后将其复制到 i。 (公平地说,几乎可以肯定会有一些省略,但基本面如前所述)。

无论如何,由于该功能,您可以放心:

m_map[0] += 1;

甚至这个:

++m_map[0];

如果之前没有映射索引,则会添加一个值初始化元素,这将对标量进行零初始化,这意味着您将正式从 开始。

值得一提的是,对于具有隐式声明的构造函数的任何类型,都会发生类似的事件。不管是不是微不足道的事情,都会发生一些有趣的事情。

struct S { int a; int b; };
std::map<int, S> mymap;

++mymap[0].a;

上述执行后,a 成员是否可靠地映射到我们容器中的 0 中的 1是的,是的。此外,考虑一下:

struct S { int a; std::string str; };
std::map<int, S> mymap;

++mymap[0].a;

现在 S 有一个重要的隐式构造函数(它必须,因为它必须构造 str)。但是 a 成员是否映射到我们容器中的 0 仍然可靠地零初始化(因此 1 在上线)? 是的,是的。

如果对引用的不同初始化路径感到好奇,see this question and answer .或者查看 C++11 标准,特别是 C++11 § 8.5 Initializers, (p5,p7,p10)。值得一读。

关于c++ - 使用 += 运算符是否可以安全地使用 [] 创建新的 std::map 条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23333261/

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