Есть ли способ использовать перечисление для символов в строке? C ++ - PullRequest
0 голосов
/ 11 мая 2018

Это было взято из 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, но я думаю, что enums намного быстрее.

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Невозможно преобразовать char или string в enum без какого-либо отображения.Потому что компилятор заменяет enum его базовым значением во время компиляции.Таким образом, вы не можете динамически получить доступ к enum с его именем, хранящимся в string.

. Вы должны использовать любой из элементов map family или if else, чтобы удовлетворить ваши потребности.

0 голосов
/ 11 мая 2018

Если вы не возражаете против незначительных накладных расходов памяти, вы можете сделать что-то вроде этого:

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

, затем

sum += table[s[i]];

и так далее.Этот подход гарантированно будет O(1), что в принципе является самым быстрым решением, которое вы можете получить.Вы также можете использовать std::array вместо массива POD, инкапсулировать все это в некоторый класс и добавить утверждения, но это идея.

0 голосов
/ 11 мая 2018

2) Я знаю, что это возможно сделать с unordered_map, но я думаю, что enums намного быстрее.

вы сравниваете апельсины с яблоками.

сначала,enum не является контейнером.в основном это просто список известных констант.

, когда вы имеете в виду время доступа operator[]:

для unordered_map:

Неупорядоченная карта - это ассоциативный контейнер, содержащий пары ключ-значение с уникальными ключами.Поиск, вставка и удаление элементов имеют среднее постоянное время сложность.

для string это также постоянное время access.

1) Возможно использование enum со строкой

Нет.Клавиша enum в основном похожа на «псевдоним» для значения.Обратите внимание, что каждая строка представляет собой последовательность символов:

V != "V"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...