【问题标题】:Refactoring code from map<char, T> to vector<T>将代码从 map<char, T> 重构为 vector<T>
【发布时间】:2015-10-08 12:01:15
【问题描述】:

其实问题出在标题上。我有一个工作代码,我大量使用std::map&lt;char, T&gt; table。 Profiler 告诉我operator[] 方法非常耗时。所以我认为由于 char 只有几个不同的值(我想是从 -128 到 127),因此可以将我的 table 变量的类型更改为 std::vector&lt;T&gt; 甚至 T[256]。 我的问题是如何安全地做到这一点。我的意思是我不能相信char 类型正好有 256 个不同的值,所以我想添加一些可移植的代码,这些代码将使用 std::numeric_limits 之类的东西,并确保table 的大小涵盖char 的所有可能值。另一个问题是我在使用std::map 时并不关心负值。但是我不能对std::vector 做同样的事情,因为table[(char)-15] 会产生异常。这是否意味着最简单的解决方案是在调用我的table 的operator[] 之前将所有键从char 转换为unsigned char?如果没有,我该怎么做?

【问题讨论】:

  • 您已经提到了解决方案:您有std::numeric_limits&lt;char&gt;::max() - std::numeric_limits&lt;char&gt;::min() 可能的值,并且对于任何char c,c - std::numeric_limits&lt;char&gt;::min() 都在索引范围内。
  • @CoryKramer,不,我没有。但对我来说,效率与便携性一样重要。我会试一试,但我很确定std::vector&lt;T&gt; 在这种情况下工作得更快。
  • char 保证为 1 字节,我还没有看到没有 8 位字节的架构。假设 char 总是有 256 个值是相当安全的。
  • @ElderBug 我刚刚搜索了一下,发现:ti.com/litv/pdf/spru281f C55x DSP 有 16 位字符。
  • @ElderBug 嗯,实际上,与 MIPS 和 ARM 相比,30 年并没有那么老。

标签: c++ dictionary vector portability


【解决方案1】:

我建议切换到std::unordered_map&lt;char, T&gt; .

对于std::unordered_map,operator[] 的复杂度表示为近似O(1)

平均情况:恒定,最坏情况:大小线性。

对于std::map,operator[] 的复杂度是O(logN)

对数容器的大小。

【讨论】:

  • 可以,但需要进行基准测试:由于键数量有限,散列它们可能比搜索它们更昂贵。仍然切换到unordered_map 应该是即时且无痛的,所以值得一试。
  • O(1) 并不意味着它更好。 unordered_map[] 涉及哈希和桶管理,而map[] 只是一个树搜索。
  • 这些都是优点,使用 unordered_map(存储桶分配、管理等)和映射(树平衡等)存在开销。我同意最好的办法是使用两个容器来分析代码,看看是否有必要进行切换。如果两者的性能都很差,那么带有一些额外密钥检查的std::array 可能是另一种方法。
【解决方案2】:

我建议引入你自己的类来使用,它会以某种方式封装std::vector&lt;T&gt;,并提供你需要的接口。

如果你要重用std::vector的大量接口,你甚至可以考虑使用implemented-in-terms-of关系:

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
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    相关资源
    最近更新 更多