簡體   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