实际上,问题在于标题。我有一个工作代码,我大量使用std::map<char, T> table
。 Profiler告诉我,operator[]
方法非常耗时。所以我认为,因为char只有几个不同的值(我认为从-128到127),我可以将table
变量的类型更改为std::vector<T>
甚至T[256]
。
我的问题是如何安全地做到这一点。我的意思是我不能依赖char
类型具有256个不同的值,所以我想添加一些可以使用类似std :: numeric_limits的可移植代码,并确保table
大小涵盖{的所有可能值{1}}。另一个问题是我在使用char
时并不关心负值。但我不能对std::map
做同样的事情,因为std::vector
会产生异常。这是否意味着最简单的解决方案是在调用table[(char)-15]
的{{1}}之前将所有密钥从char
投射到unsigned char
?如果没有,我该怎么做?
答案 0 :(得分:4)
我建议切换到std::unordered_map<char, T>
对于std::unordered_map
,operator[]
的复杂性被称为近似O(1)
平均情况:常数,最差情况:线性大小。
对于std::map
,operator[]
的复杂性为O(logN)
对数的容器大小。
答案 1 :(得分:3)
我建议引入您自己的类,以某种方式封装std::vector<T>
并提供您需要的接口。
如果您要重复使用大量std::vector
界面,您甚至可以考虑使用已实现的关系:
template <class T>
struct MyMap : protected std::vector<T>
{
using std::vector::vector;
using std::vector::push_back;
// ...
// List other members which you want to inherit verbatim
T& operator[] (char idx)
{
return std::vector::operator[](idx - std::numeric_limits<char>::min());
}
// Re-implement the members which you need to
};