std :: map:是find(key) - >比[]运算符快2秒?

时间:2011-02-20 15:24:42

标签: c++ stl map

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}运算符显然不允许(因为它可能修改了映射是一个键缺失)。

3 个答案:

答案 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中显式的值。您可以确定配置文件,但性能应该足够接近,您应该使用代码中最清晰的表单。