取消选中const函数中的地图读取

时间:2017-01-07 17:58:43

标签: c++

假设以下内容:

struct C {
    ... // lots of other stuff
    int get(int key) const { return m.at(key); } // This will never throw
private:
    std::unordered_map<int, int> m;
};

由于应用程序的工作原理,我知道get永远不会抛出。我想尽可能快地get。所以,我想取消选中访问权限,即我想写一些类似return m[key]的内容。当然,在保持get const的同时,我无法完全写出来。但是,我想保留get const,因为 逻辑上是const。

这是我提出的唯一(丑陋)解决方案:

struct C {
    ... // lots of other stuff
    int get(int key) const { return const_cast<C *>(this)->m[key]; }
private:
    std::unordered_map<int, int> m;
}; 

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

一种方法是使用std::unordered_map::find

struct C {
    ... // lots of other stuff
    int get(int key) const { return m.find(key)->second; }
private:
    std::unordered_map<int, int> m;
};

答案 1 :(得分:2)

我反对这个问题背后的理由。由于未知map.at()而导致错误相关的开销(map[]key)相比,与首先找到key的成本相比,可能很小。 然而,您只是为了获得这样一个边际效率优势而自愿承担运行时错误的严重风险,您可能甚至没有验证/测量过。您可能认为您知道key始终包含在地图中,但未来的代码更改(包括其他人引入的错误)​​可能会改变它吗?

如果您真的知道,那么您应该使用

map.find(key)->second;

如果返回的迭代器无效(即等于map.end()),则会使错误显式出现。您可以在预生产代码中使用assert,即

auto it = map.find(key);
assert(it!=map.end());
return it->second;

在生产代码中(当assert为空宏时)将被删除。