std::map实现中的运算符[] 我试图实现一个像C++一样的容器。重载运算符[]时有一个小查询。我看到该操作员以两种方式工作: mymap[2]-在本例中,它在map中查找键2并返回该键的值 mymap[2]=3-在这种情况下,它会在map中查找键2,如果找不到键,则会在map中插入键3
我看到这个操作符的声明如下:std::map实现中的运算符[] 我试图实现一个像C++一样的容器。重载运算符[]时有一个小查询。我看到该操作员以两种方式工作: mymap[2]-在本例中,它在map中查找键2并返回该键的值 mymap[2]=3-在这种情况下,它会在map中查找键2,如果找不到键,则会在map中插入键3,c++,stl,C++,Stl,我看到这个操作符的声明如下:Mapped_T&operator[](const Key_T&)但我没有得到的是,如果找不到键,我必须在Map中插入一个新元素,但在操作符[]函数的声明中,我看不到任何地方传递值。那么重载运算符如何知道要插入的键的值呢?当键不存在时,std::map使用值类的默认构造函数构造一个新值,并返回对新插入值的引用。当键不存在时,std::map使用值类的默认构造函数构造一个新值,并返回对新插入值的引用。它将被值初始化-就像使用{}一样,下面是一些伪代码: Mapped_T
Mapped_T&operator[](const Key_T&)代码>但我没有得到的是,如果找不到键,我必须在Map中插入一个新元素,但在操作符[]函数的声明中,我看不到任何地方传递值。那么重载运算符如何知道要插入的键的值呢?当键不存在时,std::map
使用值类的默认构造函数构造一个新值,并返回对新插入值的引用。当键不存在时,std::map
使用值类的默认构造函数构造一个新值,并返回对新插入值的引用。它将被值初始化-就像使用{}
一样,下面是一些伪代码:
Mapped_T & operator[](const Key_T &k) {
if(!has_key(k))
insert(k, Mapped_T{});
return at(k);
}
你的问题的重要部分是映射{}
。对于聚合,它意味着零初始化,对于具有默认构造函数的类,它意味着使用该构造函数。它将是值初始化的-就像使用{}
一样,下面是一些伪代码:
Mapped_T & operator[](const Key_T &k) {
if(!has_key(k))
insert(k, Mapped_T{});
return at(k);
}
你的问题的重要部分是映射{}
。对于聚合,它意味着零初始化;对于具有默认构造函数的类,它意味着使用该构造函数。它们都是相同的情况。书写X=Y
首先计算X
和Y
,然后再执行赋值,而X
的计算方式与上下文无关。它们都是相同的情况。在执行赋值之前,写入X=Y
首先计算X
和Y
,并且X
的计算方式与上下文无关。但是在这种情况下,如何针对该键插入实际值?正如我向您解释的:实际值是使用对象的默认构造函数构造的,并插入。对于简单类型,默认构造函数是零初始化。抱歉,我仍然没有得到它。如果我调用mymap[2]=3(假设键暂时不存在,则调用1.[]的重载运算符。键2插入了一些默认值,假设它暂时为空。但在整个过程中,5是如何插入的?默认值是0。5从何而来?这里没有5。键2插入的值为0,运算符[]
然后返回对该值的引用,=
运算符为其赋值3。不确定为什么会被否决。这是一个有效的答案。但在这种情况下,如何针对该键插入实际值?正如我向您解释的:实际值是使用对象的默认构造函数构造的,并插入。对于简单类型,默认构造函数是zero-initialization。很抱歉,我仍然没有得到它。如果我调用mymap[2]=3(假设键暂时不存在,那么1。为[]重载运算符被称为2。键2是用一些默认值插入的,假设它现在为空。但是在整个过程中,5是如何插入的?默认值是0。5是从哪里来的?这里没有5。键2是用值0插入的,运算符[]
然后返回对该值的引用,=
运算符为其指定3。不确定为什么会被否决。这是一个有效的答案。那么您的意思是调用初始化器列表来根据映射中的键复制实际值?不,在该代码中的任何地方都没有初始化器列表
。所以您的意思是初始化器列表将是b调用e以根据映射中的键复制实际值?否,此代码中没有初始值设定项列表
。