Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::map操作符[]并自动创建新对象_C++_Stl_Map_Variable Assignment_Operator Keyword - Fatal编程技术网

C++ std::map操作符[]并自动创建新对象

C++ std::map操作符[]并自动创建新对象,c++,stl,map,variable-assignment,operator-keyword,C++,Stl,Map,Variable Assignment,Operator Keyword,我有点害怕这样的事情: std::map<DWORD, DWORD> tmap; tmap[0]+=1; tmap[0]+=1; tmap[0]+=1; 因为DWORD不是自动初始化的,所以我总是担心tmap[0]是一个递增的随机数。如果运行时不知道如何初始化DWORD,映射如何知道如何初始化DWORD 是否保证结果始终为tmap[0]==3?是。当运算符[]将新值插入到映射中时,该值已初始化,对于内置数字类型,DWORD是内置类型的typedef,这意味着零。是。当运

我有点害怕这样的事情:

std::map<DWORD, DWORD> tmap;
  tmap[0]+=1;
  tmap[0]+=1;
  tmap[0]+=1;
因为DWORD不是自动初始化的,所以我总是担心tmap[0]是一个递增的随机数。如果运行时不知道如何初始化DWORD,映射如何知道如何初始化DWORD


是否保证结果始终为tmap[0]==3?

是。当运算符[]将新值插入到映射中时,该值已初始化,对于内置数字类型,DWORD是内置类型的typedef,这意味着零。

是。当运算符[]将新值插入到映射中时,该值已初始化,对于内置数字类型,DWORD是内置类型的typedef,这意味着零。

是。如果传递给运算符[]的键不存在,则map将默认构造对象并将其插入。在您的情况下,它将执行DWORD,这将产生一个值0。

是。如果传递给运算符[]的键不存在,则map将默认构造对象并将其插入。在您的情况下,它将执行DWORD,这将产生一个值0。

当通过[]运算符插入映射时,新对象的值已初始化。map实现确保了这一点,也就是说,它是自动完成的。对于DWORD类型的对象(假设它是标量类型),值初始化意味着零初始化

根据23.3.1.2中给出的定义,运算符[]是

(*((insert(make_pair(x, T()))).first)).second

T位是新对象,在您的例子中,它将变成DWORD。DWORD保证为零。

当通过[]运算符插入映射时,新对象的值已初始化。map实现确保了这一点,也就是说,它是自动完成的。对于DWORD类型的对象(假设它是标量类型),值初始化意味着零初始化

根据23.3.1.2中给出的定义,运算符[]是

(*((insert(make_pair(x, T()))).first)).second


T位是新对象,在您的例子中,它将变成DWORD。DWORD保证为零。

当您使用非标准类型(如DWORD)时,最好描述它们的真实情况,即使您认为每个人都应该知道这一点。不太相关,但我真的很讨厌“操作符[]”将对象插入地图,我更喜欢尝试访问'std::vector'@Viktor中超出范围的元素的行为:因此您更喜欢使用下限方法,检查键的相等性,并选择使用递减迭代器更新或插入,除非它作为提示开始?或者您只是希望他们不要使用此运算符,而是使用一个命名方法吗?运算符[]并不真正更新或插入。它得到,也许是插入;这就是我希望人们使用它的方式。当你使用像DWORD这样的非标准类型时,最好描述它们到底是什么,即使你认为每个人都应该知道。不是很相关,但我真的很讨厌“操作符[]”将对象插入地图,我更喜欢尝试访问'std::vector'@Viktor中超出范围的元素的行为:因此您更喜欢使用下限方法,检查键的相等性,并选择使用递减迭代器更新或插入,除非它作为提示开始?或者您只是希望他们不要使用此运算符,而是使用一个命名方法吗?运算符[]并不真正更新或插入。它得到,也许是插入;这就是我希望人们使用它的方式。我真的不知道内置数据类型存在值初始化。这让我的生活更轻松!我懂了。但是,如果T类型的默认构造函数非常昂贵,并且映射已经包含键x,那么这种速记方式就非常无效!或者我错了吗???@thomas gies:你是对的,如果按照上面所示的方式执行,它确实是无效的。我希望一个高质量的实现能够以一种更合理的方式实现同等的功能。给定std::map;,语句map[x]=y要求对现有的U调用U::operator=U const&唯一合理的方法是对创建的默认值调用它U@MSalters:是的,但是Thomas特别提到了钥匙已经在地图上时的情况,钥匙是如何到达那里的-没有关系,即U部分已经存在。在这种情况下,文本实现将无条件地预构造一个绝对不必要的U,然后发现它不需要并销毁它。U的这种无用的构造破坏可能是一个高质量的实现可以通过首先运行map check中已经存在的键来避免的。这让我的生活更轻松!我懂了。但是,如果T类型的默认构造函数非常昂贵,并且映射已经包含键x,那么这种速记方式就非常无效!还是我错了???@thomas gies:你是对的,如果简单的
如上图所示,按字面上的意思进行注释。我希望一个高质量的实现能够以一种更合理的方式实现同等的功能。给定std::map;,语句map[x]=y要求对现有的U调用U::operator=U const&唯一合理的方法是对创建的默认值调用它U@MSalters:是的,但是Thomas特别提到了钥匙已经在地图上时的情况,钥匙是如何到达那里的-没有关系,即U部分已经存在。在这种情况下,文本实现将无条件地预构造一个绝对不必要的U,然后发现它不需要并销毁它。这种U的无用构造破坏是一个高质量的实现可能通过首先运行映射检查中已经存在的键来避免的。