std::map<long, double> x;
x[5] = 1.2;
double y = x[5];
double z = x.find(5)->second;
这两项任务中的一项会比另一项执行得更快吗? (假设所请求的密钥始终存在于映射中)在执行x.find(5)->second
时是否存在与解除引用迭代器相关的任何开销?
编辑:感谢您的回复。在我的特定函数中,现在我知道它并不慢,我可能会使用x.find(5)->second
,因为我需要标记我的函数const
(映射是成员变量)和{{1}运算符显然不允许(因为它可能修改了映射是一个键缺失)。
答案 0 :(得分:12)
这不能解答您的问题,但我会指出您使用find
的方式存在一些问题。
double y = x[5];
double z = x.find(5)->second;
我无法评论哪个更快。但我可以肯定地说第一种方法是安全的!
如果地图不包含给定的密钥怎么办?
在第一种方法中,它将使用给定的键 创建新的pair
,并使用默认值初始化值值double
(为零),并将其返回。
但是第二个方法呢?如果在容器中找不到指定的密钥,find
将返回map::end
,并且您将其解除引用。程序崩溃!
使用find
的正确方法是:
std::map<long, double>::iterator it;
if ( (it = x.find(key)) != x.end() )
{
double value = it->second;
}
答案 1 :(得分:9)
直接从<map>
:
mapped_type& operator[](const key_type& _Keyval)
{ // find element matching _Keyval or insert with default mapped
iterator _Where = this->lower_bound(_Keyval);
if (_Where == this->end()
|| this->comp(_Keyval, this->_Key(_Where._Mynode())))
_Where = this->insert(_Where,
value_type(_Keyval, mapped_type()));
return ((*_Where).second);
}
iterator find(const key_type& _Keyval)
{ // find an element in mutable sequence that matches _Keyval
iterator _Where = lower_bound(_Keyval);
return (_Where == end()
|| _DEBUG_LT_PRED(this->comp,
_Keyval, _Key(_Where._Mynode()))
? end() : _Where);
}
看起来大致相同。应该有什么区别:
iterator _Where = this->lower_bound(_Keyval);
return ((*_Where).second);
和
iterator i = x.find(5);
double d = (*i).second;
我不这么认为。
答案 2 :(得分:2)
使用operator[]
的第一个作业必须执行相同的取消引用才能检索find()->second
中显式的值。您可以确定配置文件,但性能应该足够接近,您应该使用代码中最清晰的表单。