内置类型的 std::map 默认值

     2023-03-15     219

关键词:

【中文标题】内置类型的 std::map 默认值【英文标题】:std::map default value for build-in type 【发布时间】:2011-05-30 06:23:19 【问题描述】:

最近,我对 std::map operator[] 函数感到困惑。 在 MSDN 库中,它说:“如果未找到参数键值,则将其与数据类型的默认值一起插入。” 我试图为这个问题寻找更准确的解释。例如这里: std::map default value 在这个页面中,Michael Anderson 说“默认值是由默认构造函数(零参数构造函数)构造的”。

现在我的任务是:“内置类型的默认值是多少?”。它与编译器有关吗?或者 c++ 标准委员会是否有针对这个问题的标准?

我在 Visual Studio 2008 上对“int”类型进行了测试,发现“int”类型的值是 0。

【问题讨论】:

我用“bool”类型做了一个测试。还有一些奇怪的东西:当我使用“bool b = new bool()”时,b 的值变成了 0;但是当我使用“bool *pb = new bool[10]; pb[0] = new bool();”然后 pb[0] 变成 1,即正值。哦,我在visual studio 2008上做了这个测试。 当你写pb[0] = new bool();时,new bool()是一个指针,而p[0]是一个布尔值。指针可以隐式转换为bool,如果指针为空指针,则返回结果false,否则返回true。因此,您观察到的真实值只是告诉您 new 没有返回空指针(当然,普通的 new 无论如何都不会返回)。另外,你泄露了分配。 【参考方案1】:

类类型对象的默认值是由类的默认构造函数设置的。对于内置类型,默认值为 0。

但请注意,未初始化的内置变量与已初始化为其默认值的变量之间存在差异。未初始化的内置函数可能会保存当时该变量的内存地址中的任何值。

int i;          // i has an arbitrary undefined value
int x = int();  // x is 0

【讨论】:

以上链接已过时。见这里:stroustrup.com/glossary.html。不知道它有什么帮助 不。对于内置类型,未定义默认值。内置类型的默认构造函数什么都不做。【参考方案2】:
 |expression:   | POD type T                               | non-POD type T
 ==================================================================================================
 | new T         | not initialized                          | default-initialized
 | new T()       | always default-initialized               | always default-initialized
 | new T(x)      | always initialized via a constructor     | always initialized via a constructor

据我所知,stl 使用 new T() 作为默认值,因此它将被默认初始化,以防 int 为 0。

【讨论】:

new T() 表示值初始化。值初始化不同于默认初始化。 new T() 暗示值初始化?使用new T()时值初始化和默认初始化有什么区别?【参考方案3】:

这是在标准中定义的,是的。在这种情况下,map 正在执行“默认初始化”。正如您所说,对于类类型,它调用无参数构造函数。

对于内置类型,在 '98 标准中,请参阅第 8.5 节“初始化程序”:

默认初始化 T 类型的对象意味着:

如果 T 是非 POD ... 如果 T 是数组类型 ... 否则,对象的存储是零初始化的

之前,

对 T 类型的对象进行零初始化存储意味着:

如果 T 是标量类型,则存储设置为转换为 T 的值 0(零)

标量类型有:

算术类型(整数、浮点) 枚举类型 指针类型 指向成员类型的指针

特别是,您看到的整数(初始化为零)的行为是由标准定义的,您可以依赖它。

【讨论】:

我刚刚在 C++11 标准中检查了这一点,它说的有些不同。它表示如果类型不是类或数组,则不执行初始化。所以我现在不确定标准容器中的默认值。 过时标准的引用具有误导性,因为默认情况下,许多 POD 实例没有默认初始化。即使在 C++98 中,POD 类型的默认设置也是根本不初始化它们。用 C++11 清理了术语(并且变得非常复杂)。只有值初始化才能可靠地进行零初始化。【参考方案4】:

C++11 标准仍然要求 std::map 对内置类型进行零初始化(就像以前的标准一样),但原因与 Luke Halliwell 的回答中的原因有些不同。特别是,“默认初始化”内置数据类型并不在 C++11 标准中意味着零初始化,而是意味着“什么都不做”。 std::map::operator[] 中实际发生的是“值初始化”。

尽管如此,新标准的最终结果与卢克的答案相同。这些值将被零初始化。以下是标准的相关部分:

第 23.4.4.3 节“地图元素访问”说

T& 运算符[](const key_type& x);

效果:如果映射中没有与 x 等效的键,则将 value_type(x, T()) 插入映射中。

...

表达式T()在第8.5节中描述

初始化器为空括号集的对象,即 (),应值初始化

X a();

并且这种“值初始化”在同一节中进行了描述

对 T 类型的对象进行值初始化意味着:

如果 T 是具有用户提供的构造函数 (12.1) 的(可能是 cv 限定的)类类型(第 9 条),则 T 的默认构造函数 被调用(如果 T 不可访问,则初始化格式错误 默认构造函数); 如果 T 是(可能是 cv 限定的)非联合类类型,没有用户提供的构造函数,则该对象为零初始化,如果 T 隐式声明的默认构造函数是不平凡的,即 构造函数被调用。 如果T是数组类型,那么每个元素都是值初始化的; 否则,对象被零初始化。

【讨论】:

如何为没有默认构造函数的对象指示 std::unordered_map 的值构造

】如何为没有默认构造函数的对象指示std::unordered_map的值构造【英文标题】:Howtoinstructstd::unordered_map\'svalueconstructionforobjectsthatdon\'thaveadefaultconstructor【发布时间】:2019-03-2715:04:31【问题描述】:假设我有以下课程:structFooFoo(intb... 查看详情

C++ std::map 持有任何类型的值

】C++std::map持有任何类型的值【英文标题】:C++std::mapholdingANYtypeofvalue【发布时间】:2014-09-0208:16:46【问题描述】:基本上,我希望MyClass包含一个Hashmap,它将字段名称(字符串)映射到任何类型的值..为此,我编写了一个单独的M... 查看详情

默认初始化值初始化

...初始化  变量没有指定初始值,则被默认初始化。  内置类型:全局变量的内置类型没有指定初始值,被初始化为0;局部变量则不被初始化。  类:执行默认构造函数(如果默认构造函数是编译器合成的,类中的内置类... 查看详情

使用 C 类型 uuid_t 作为 std::map 中的键的最佳方法是啥?

】使用C类型uuid_t作为std::map中的键的最佳方法是啥?【英文标题】:whatisthebestwaytousetheCtypeuuid_tasakeyinastd::map?使用C类型uuid_t作为std::map中的键的最佳方法是什么?【发布时间】:2011-11-2008:59:00【问题描述】:这是在地图中提供唯... 查看详情

计算向量的 std::map 的值作为键并作为值的两倍?

】计算向量的std::map的值作为键并作为值的两倍?【英文标题】:Computingthevaluesofastd::mapofvectorasthekeyanddoubleasthevalue?【发布时间】:2018-03-2905:58:46【问题描述】:std::map<std::vector<double>,double>MyMethod(std::map<std::vector<doubl 查看详情

在编译时查找 std::map 的重复值

】在编译时查找std::map的重复值【英文标题】:Findingduplicatevaluesofstd::mapatcompiletime【发布时间】:2021-09-1405:24:17【问题描述】:我有一个模板类(BiMap),它被用作双向地图,用于查找目的,例如enum值映射到std::string等效项,反之亦... 查看详情

C++ std::unordered_map 中使用的默认哈希函数是啥?

】C++std::unordered_map中使用的默认哈希函数是啥?【英文标题】:WhatisthedefaulthashfunctionusedinC++std::unordered_map?C++std::unordered_map中使用的默认哈希函数是什么?【发布时间】:2013-10-2501:24:52【问题描述】:我正在使用unordered_map<strin... 查看详情

std::unordered_map::find 使用不同于 Key 类型的类型?

】std::unordered_map::find使用不同于Key类型的类型?【英文标题】:std::unordered_map::findusingatypedifferentthantheKeytype?【发布时间】:2016-01-0417:42:12【问题描述】:我有一个使用字符串类型作为键的unordered_map:std::unordered_map<string,value>... 查看详情

1.3内置数据类型(代码片段)

内置数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。byte:byte数据类型是8位、有符号的,以二进制补码表示的整数;最小值是-128(-2^7);最大值是127(2^7-1... 查看详情

具有私有构造函数的 unordered_map 值类型

】具有私有构造函数的unordered_map值类型【英文标题】:unordered_mapvaluetypewithprivateconstructor【发布时间】:2015-08-2612:23:42【问题描述】:我需要以下代码:classmyclassprivate:myclass()friendmyclass*make_myclass(conststd::string&);;std::unordered_map&... 查看详情

为什么内置排序无法对向量的映射进行排序?(代码片段)

为什么STL排序不适用于map<int,vector<int>>?我错过了什么,或者我需要做比较功能和排序。任何人都可以提出一些想法。#include<iostream>#include<vector>#include<map>#include<algorithm>intmain()std::map<int,std::vector<i... 查看详情

具有 std::map 和 std::variant 的不完整类型

】具有std::map和std::variant的不完整类型【英文标题】:incompletetypeswithstd::mapandstd::variant【发布时间】:2018-11-0809:31:26【问题描述】:考虑在std::variant之上递归变体的这种简化且非常具体的实现:#include<map>#include<variant>stru... 查看详情

如何将 std::map 作为默认构造函数参数传递

】如何将std::map作为默认构造函数参数传递【英文标题】:Howtopassstd::mapasadefaultconstructorparameter【发布时间】:2011-05-0622:32:45【问题描述】:我无法弄清楚这一点。创建两个ctor很容易,但我想了解是否有简单的方法可以做到这一... 查看详情

std::map 扩展初始值设定项列表是啥样的?

】std::map扩展初始值设定项列表是啥样的?【英文标题】:Whatwouldastd::mapextendedinitializerlistlooklike?std::map扩展初始值设定项列表是什么样的?【发布时间】:2011-03-1601:47:15【问题描述】:如果它真的存在,std::map扩展初始化列表会... 查看详情

c++11 使用 std::map 作为返回值

...021-11-1513:34:34【问题描述】:我通常返回std::vector或std::map的对象作为传入的参考参数(如下面的funcVec2和funcMap2)。但是写代码的时候有点不方便。所以我想如果我可以在c++11下使用返回值(如下面的funcVec1和funcMap1),因为它会... 查看详情

std::map 有没有办法像键的谓词一样“编辑”值?

】std::map有没有办法像键的谓词一样“编辑”值?【英文标题】:Isthereawayforstd::mapto"edit"valueslikeapredicateforthekey?【发布时间】:2010-12-2501:35:43【问题描述】:我想知道是否可以为std::map的所有值创建一个谓词之类的东西,... 查看详情

如何根据 std::map 的值获取前 n 个键?

】如何根据std::map的值获取前n个键?【英文标题】:Howcanigetthetopnkeysofstd::mapbasedontheirvalues?【发布时间】:2013-07-3107:13:55【问题描述】:如何根据值获取std::map的前n个键?有没有一种方法可以让我得到一个列表,例如前10个键值... 查看详情

在 std::map 中查找最接近或准确的键

...个将长度链接到时间间隔的查找表(两者都是双精度数据类型)。键在插入时线性递增,因此它已经被排序(也许unordered_map会更好?)。我正在寻找一种方法来找到与提供的当前长度最匹配的密钥以获取时间值,或者更好地找... 查看详情