将映射<char,t =“”>中的代码重构为vector <t>

时间:2015-10-08 12:01:15

标签: c++ dictionary vector portability

实际上,问题在于标题。我有一个工作代码,我大量使用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?如果没有,我该怎么做?

2 个答案:

答案 0 :(得分:4)

我建议切换到std::unordered_map<char, T>

对于std::unordered_mapoperator[]的复杂性被称为近似O(1)

  

平均情况:常数,最差情况:线性大小。

对于std::mapoperator[]的复杂性为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
};