【发布时间】:2015-10-08 12:01:15
【问题描述】:
其实问题出在标题上。我有一个工作代码,我大量使用std::map<char, T> table。 Profiler 告诉我operator[] 方法非常耗时。所以我认为由于 char 只有几个不同的值(我想是从 -128 到 127),因此可以将我的 table 变量的类型更改为 std::vector<T> 甚至 T[256]。
我的问题是如何安全地做到这一点。我的意思是我不能相信char 类型正好有 256 个不同的值,所以我想添加一些可移植的代码,这些代码将使用 std::numeric_limits 之类的东西,并确保table 的大小涵盖char 的所有可能值。另一个问题是我在使用std::map 时并不关心负值。但是我不能对std::vector 做同样的事情,因为table[(char)-15] 会产生异常。这是否意味着最简单的解决方案是在调用我的table 的operator[] 之前将所有键从char 转换为unsigned char?如果没有,我该怎么做?
【问题讨论】:
-
您已经提到了解决方案:您有
std::numeric_limits<char>::max() - std::numeric_limits<char>::min()可能的值,并且对于任何char c,c - std::numeric_limits<char>::min()都在索引范围内。 -
@CoryKramer,不,我没有。但对我来说,效率与便携性一样重要。我会试一试,但我很确定
std::vector<T>在这种情况下工作得更快。 -
char保证为 1 字节,我还没有看到没有 8 位字节的架构。假设char总是有 256 个值是相当安全的。 -
@ElderBug 我刚刚搜索了一下,发现:ti.com/litv/pdf/spru281f C55x DSP 有 16 位字符。
-
@ElderBug 嗯,实际上,与 MIPS 和 ARM 相比,30 年并没有那么老。
标签: c++ dictionary vector portability