Если вы хотите связать значение с индексом и быстро найти индекс, вы можете использовать std::map
или std::unordered_map
. Вы также можете комбинировать их с другими структурами данных (например, std::list
или std::vector
) в зависимости от других операций, которые вы хотите выполнить с данными.
Например, при создании вектора мы также создать таблицу поиска:
vector<int> test(test_size);
unordered_map<int, size_t> lookup;
int value = 0;
for(size_t index = 0; index < test_size; ++index)
{
test[index] = value;
lookup[value] = index;
value += rand()%100+1;
}
Теперь искать индекс просто:
size_t index = lookup[find_value];
Использование структуры на основе данных хеш-таблицы (например, unordered_map) является довольно классическим компромиссом пространства/времени и может превзойти выполнение двоичного поиска для такого рода «обратного» поиска, когда вам нужно много искать. Другим преимуществом является то, что он также работает, когда вектор является несортированным.
Для удовольствия :-) Я сделал быстрый тест в VS2012RC сравнения Джеймса двоичного кода поиска с помощью линейного поиска и с помощью unordered_map для поиска, все на векторе:
К ~ 50000 элементов unordered_set значительно (x3-4) превосходит бинарный поиск, который демонстрирует ожидаемое поведение O (log N), несколько неожиданным результатом является то, что unordered_map теряет свое поведение O (1) за 10000 элементов, предположительно из-за хеш-коллизий, возможно, реализация вопрос.
EDIT: max_load_factor() для неупорядоченной карты 1, поэтому не должно быть никаких столкновений. Разница в производительности между бинарным поиском и хэш-таблицей для очень больших векторов, по-видимому, связана с кешированием и варьируется в зависимости от шаблона поиска в эталонном тесте.
Choosing between std::map and std::unordered_map рассказывает о различии между упорядоченными и неупорядоченными картами.
это даже скомпилировать? – Ulterior
@Ulterior: Да, это копия-макароны из моей библиотеки CxxReflect. См. [Algorithm.hpp] (http://cxxreflect.codeplex.com/SourceControl/changeset/view/8ffbb562ad38#cxxreflect%2fcore%2falgorithm.hpp). –
Почему бы это не скомпилировать? Я не вижу признаков ошибки. – Puppy