Использование шаблона для создания статической таблицы поиска

У меня есть:

const char kLetters[] = "QWERTYUIOPASDFGHJKLZXCVBNM";

Я могу вызвать kLetters [n] , чтобы получить n-ю букву алфавита клавиатуры за O (1) раз. Тем не менее, мне придется повторить через kLetter (занимающее время O (n) или, по крайней мере, O (log n)) для обратного просмотра.

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

EDIT - как упоминалось в комментариях, обратный поиск будет означать, что я поставляю 'E' и возвращаюсь 2. Также мой алфавитный пример был не лучшим примером, я хотел бы не делать никаких предположений относительно порядка. По этой причине я изменил алфавит на порядок клавиатуры.

-121--1830953- Кодовые контракты: Гарантирует недоказанность и требует недоказанности Я не уверен, что делаю что-то не так или это нужно исправить... У меня есть пользовательский класс обертки словаря, и вот фрагмент кода, который необходим. общее число входов {получить...

Я не уверен, что я делаю что-то не так или это нужно исправить...

У меня есть пользовательский класс оболочки словаря, и вот фрагмент кода, который необходим.

public int Count
{
    get
    {
        Contract.Ensures(Contract.Result<int>() >= 0);

        return InternalDictionary.Count;
    }
}

public bool ContainsKey(TKey key)
{
    //This contract was suggested by the warning message, if I remove it
    //I still get the same warning...
    Contract.Ensures(!Contract.Result<bool>() || Count > 0);

    return InternalDictionary.ContainsKey(key);
}

Единственная причина, по которой я добавил строку для ContainsKey, заключается в том, что я получил следующее предупреждающее сообщение (и все еще делаю): Codecontracts: обеспечивает недоказанность:! Contract.Result < bool > () | | @ this.Count > 0 . Я могу удалить эту строку и все еще получить SAME ISSUE !

Что мне здесь делать, чтобы избавиться от этих проблем?


Обновление:

Я также попытался (как и предлагалось)...

public Boolean ContainsKey(TKey key)
{
    Contract.Requires(Count == 0 || InternalDictionary.ContainsKey(key));
    Contract.Ensures(!Contract.Result<bool>() || Count > 0);

    return InternalDictionary.ContainsKey(key);
}

Метод предупреждения 5 'Мой. Коллекции. Универсальный. ReadOnlyDictionary2. ContainsKey (тип параметр. TKey) 'реализует метод интерфейса 'System.Collections.Generic.IDictionary 2.Key (параметр типа. TKey) ', поэтому не может добавить Требует.

6
задан michael 14 September 2011 в 17:12
поделиться