繁体   English   中英

有没有办法对字符串中的字符使用枚举? C ++

[英]Is there a way to use an enum for characters in a string? C++

这是从LeetCode上删除的,但是基本上给出了一个由几个唯一字符组成的字符串,每个字符都有一个关联的整数值,我需要快速处理该字符串的总整数值。 我认为枚举将很有用,因为您知道什么将构成字符串。

枚举是字符串中可以包含的字符类型(可以看到它是有限的)。 如果具有较小值的字符位于具有较大值的字符之前,例如IV,则我从其后的字符中减去前一个字符的值。 否则,您添加。 代码是我的尝试,但是我无法让枚举与我的算法一起使用...

std::string s = "III";
int sum = 0;

enum {I = 1, V = 5, X = 10, L = 50, C = 100, D = 500, M = 1000};

// O(n) iteration.
for (int i = 0; i < s.length(); i++) {
  // Must subtract.
  if (s[i] < s[i+1]) {
    sum += s[i+1] - s[i];
  }
  // Add.
  else {
    sum += s[i];
  }
}

std::cout << "sum is: " << sum;

那么我的问题是1)是否可以将enum与字符串一起使用? 2)我知道可以使用unordered_map,但是我认为枚举要快得多。

如果您不介意较小的内存开销,则可以执行以下操作:

int table[256];
table['I']=1;
table['V']=5;
...

接着

sum += table[s[i]];

等等。 该方法保证为O(1) ,这基本上是您可以获得的最快解决方案。 您也可以使用std::array而不是POD数组,将所有这些封装在某个类中并添加断言,但这就是这个主意。

2)我知道可以使用unordered_map,但是我认为枚举要快得多。

您正在将桔子与苹果进行比较。

首先, enum不是容器。 它基本上就像一系列已知常量一样。

当您指的是operator[]的访问时间时:

对于unordered_map

无序映射是一个关联容器,其中包含具有唯一键的键值对。 搜索,插入和删除元素的平均 恒定时间复杂度。

对于string这也是恒定时间访问。

1)可能使用带字符串的枚举

否。 enum键基本上就像值的“别名”。 请注意,每个字符串都是一个字符序列:

V != "V"

如果没有某种类型的映射,就不可能将charstring转换为enum 因为编译器会在编译过程中用其基础值替换enum 因此,您无法动态访问带有存储在stringenum

您必须使用map系列中的任何一个,或者if else构造来满足您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM