map :: count的效率后跟map :: operator []

时间:2015-08-04 09:49:59

标签: c++ stl c++-standard-library

有一种已知的问题,当地图包含一些元素并且需要访问该元素时,而“未找到元素”情况最好仅通过if-check来处理,那么仍然缺乏标准方法轻松“请让我访问映射到给定键的元素,通过一些有意义的值告诉我它不存在,然后让我访问它”。

我的目标是:我需要一个干净,简单的方法,在代码中可读性很好,当然,效率很高。这是“官方”的方式:

map<int, vector<Command> > m;
map<int, vector<Command> >::iterator i = m.find(required_key);
if ( i == m.end() )
     error_not_found();
i->second.SetCode(x);

这是我使用的,并且由于可读性而更喜欢 - 我的问题是:这种方法对于上面的官方效率的效率如何

map<int, vector<Command> > m;
if ( !m.count(required_key) )
   error_not_found();
m[required_key].SetCode(x);

2 个答案:

答案 0 :(得分:4)

显而易见的效率打击是,在&#34;官方&#34;中,查找必须完成两次。代码,它完成一次。对于大型地图上的许多访问,这将是显而易见的。也请注意,即使&#34;官方&#34;代码可能不太可读,它仍然是众所周知的,它也适用于只读映射。 C ++ 11s auto可能有助于提高可读性。

答案 1 :(得分:3)

您的方法会进行两次查找,而官方只进行一次查找 如果error_not_found();抛出,您可以改为使用std::map::at,当找不到密钥时抛出该m.at(required_key).SetCode(x); 并且只有:{/ p>

template<typename Map, typename Key>
auto value(Map& m, const Key& key)
{
    auto it = m.find(key);

    return it == m.end() ? nullptr : std::addressof(it->second);
}

你仍然可以编写辅助函数来增加可读性并保持性能:

std::map<int, Command> m;

auto* command = value(m, required_key);
if (command == nullptr) {
   return error_not_found();
}
command->SetCode(x);

然后

'/category/:id'
相关问题