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以根据映射中的键复制实际值?否,此代码中没有
初始值设定项列表