C++ std::映射未插入空?

C++ std::映射未插入空?,c++,map,C++,Map,今天我注意到空的映射[key]将在映射中创建一个空元素。我没想到会这样。是否有一个类似于映射的容器,在其中我只获取null而不创建元素?我想没有,也需要用.find()替换我所有的[]。你被find()卡住了。这就是map的设计方式,没有类似的容器将这种行为作为唯一的区别。(或者正如BoBTFish所说,您可以在上使用) 更详细地说,您不能有对空值的引用。这意味着您可以使用指向元素或end()的迭代器,也可以使用返回引用或引发异常的方法find()和at()是这两个选项。您必须使用find()。

今天我注意到空的映射[key]将在映射中创建一个空元素。我没想到会这样。是否有一个类似于映射的容器,在其中我只获取null而不创建元素?我想没有,也需要用.find()替换我所有的[]。

你被find()卡住了。这就是
map
的设计方式,没有类似的容器将这种行为作为唯一的区别。(或者正如BoBTFish所说,您可以在上使用

更详细地说,您不能有对空值的引用。这意味着您可以使用指向元素或end()的迭代器,也可以使用返回引用或引发异常的方法
find()
at()
是这两个选项。

您必须使用find()。这就是
map
的设计方式,没有类似的容器将这种行为作为唯一的区别。(或者正如BoBTFish所说,您可以在
上使用


更详细地说,您不能有对空值的引用。这意味着您可以使用指向元素或end()的迭代器,也可以使用返回引用或引发异常的方法
find()
at()
是这两个选项。

如果您不喜欢,您可以创建自己的容器,委托给
std::map
,但提供不同的
const
实现
操作符[]
。当然,请注意
操作符[]
返回引用的整个要点是:

std::map<Key, Value> theMap;
theMap[someKey] = someValue;

这似乎比使用
find
/
at
进行查找更糟糕。(或者您可以让
操作符[]
返回一个迭代器到找到的项,但是这与使用
查找
完全相同)

如果您不喜欢它,您可以创建自己的容器,该容器委托给
std::map
,但提供一个不同的
const
实现
操作符[]
。当然,请注意
操作符[]
返回引用的整个要点是:

std::map<Key, Value> theMap;
theMap[someKey] = someValue;

这似乎比使用
find
/
at
进行查找更糟糕。(或者您可以让
操作符[]
向找到的项返回迭代器,但这与使用
find
完全相同)

如何“获取空值”?语义是
operator[]
通过引用返回。查看
at()
而不是
find()
:@juanchopanza:map[invalid_key]创建元素并将其粘贴到map中的相同方法;)但是它是通过引用返回的,因此如果不插入元素,就没有什么有意义的方法可以实现这一点。null的概念对于值也不清楚。您无法区分默认的初始化值和一些“null”值。虽然
at
很容易使用异常来处理您的控制流,但在这里似乎很笨拙。我宁愿坚持使用
查找
。不过,我想看看这两者的性能比较。您如何“获得空值”?语义是
operator[]
通过引用返回。查看
at()
而不是
find()
:@juanchopanza:map[invalid_key]创建元素并将其粘贴到map中的相同方法;)但是它是通过引用返回的,因此如果不插入元素,就没有什么有意义的方法可以实现这一点。null的概念对于值也不清楚。您无法区分默认的初始化值和一些“null”值。虽然
at
很容易使用异常来处理您的控制流,但在这里似乎很笨拙。我宁愿坚持使用
查找
。不过,我想看看两者的性能比较。哦,对了,我忘了
[]=
是读/写,而不仅仅是写。我想我被C#indexer宠坏了+1提醒我和解释哦,对了,我忘了
[]=
是读/写,而不仅仅是写。我想我被C#indexer宠坏了+谢谢你提醒我和解释