Случай динамического переключения в C ++ - PullRequest
0 голосов
/ 19 июня 2011

Есть ли способ построить случай динамического переключения в C ++. На самом деле значения регистра известны мне только во время выполнения, а число значений регистра также известно только во время выполнения. Причина, по которой я это делаю, заключается в том, что я пытаюсь создать идеальный поиск хеша через этот случай коммутатора во время выполнения. Так, например, у меня есть четыре значения 89, 94, 38, 54, я хочу что-то эквивалентное следующим образом.

switch( x )
{
case 89:
  return 0;
case 94:
  return 1;
case 38:
  return 2;
case 54;
  return 3;
}

Однако, это должно быть построено во время выполнения. Конечно, мы можем использовать цикл for и поиск для реализации поиска хеша, но это, конечно, медленнее, чем переключение.

Ответы [ 9 ]

4 голосов
/ 19 июня 2011

К сожалению, нет, случаи переключения принимают только те значения, которые известны как константы во время компиляции.Конечно, если вы просто используете if и if else вместо переключателей, он будет делать то, что вам нужно, просто отлично.

2 голосов
/ 19 июня 2011

Вы хотите что-то, называемое таблицей переходов - в вашем случае, построенное во время выполнения. Это в основном состоит из массива функциональных объектов, которые возвращают желаемые значения, где вы индексируете его ключом.

Вы также можете использовать хэш-карту, которая менее эффективна, если диапазон относительно мал, но определенно лучше, если диапазон большой.

2 голосов
/ 19 июня 2011

Вы можете выполнить то, что ищете, с помощью хеш-таблицы.Основная идея состоит в том, чтобы сопоставить 89, 94, 38 , 54 со значениями 0, 1, 2, 3.Тогда поиск будет

i = 38;
return hashtable[i];  //returns 2. 

Если у вас есть небольшой верхний предел наибольшего значения (скажем, 99), это просто массив.используйте хеш-функцию или предпочтительно предопределенную хеш-таблицу.

0 голосов
/ 19 июня 2011

Если вы действительно хотите идеальный хеш, я предлагаю вам использовать что-то вроде библиотеки cmph или реализовать ее самостоятельно (см. эту статью для примера, реализованного в python)

0 голосов
/ 19 июня 2011

Используйте хэш-карту. Если бы существовал более быстрый метод, люди использовали бы его как стандартную карту.

Также помните, что преждевременная оптимизация - корень всего зла.

0 голосов
/ 19 июня 2011

операторы switch обычно оптимизируются для таблицы переходов во время компиляции, поэтому это никак не сработает.Они должны быть постоянными времени компиляции.(Можете ли вы использовать шаблонное метапрограммирование для генерации их на этапе компиляции?)

0 голосов
/ 19 июня 2011

A для цикла с линейным зондированием не будет примером хеш-таблицы.

Стандартным способом было бы использовать классы хеша, предоставляемые boost, stl и многими другими популярными библиотеками.Вероятно, он будет не таким быстрым, как коммутатор, но будет намного лучше, чем зацикливание.

0 голосов
/ 19 июня 2011

Я предлагаю двоичный поиск по массиву, или, если ваш домен достаточно мал, вы можете просто выполнить поиск по массиву.

0 голосов
/ 19 июня 2011

Нет, вы не можете создать регистр динамически во время выполнения.Вместо этого вы должны представить свою хеш-функцию, используя некоторую алгоритмическую структуру данных, которая соответствует вашим потребностям, и искать в ней.

...