То, что вам нужно, - это способ поиска данных по ключу. С ключом unsigned int
это дает вам несколько возможностей. Конечно, вы можете использовать std::map
:
typedef std::map<unsigned int, record_t> my_records;
Однако есть и другие возможности. Например, вполне вероятно, что хеш-карта будет еще быстрее , чем двоичное дерево. Хеш-карты называются unordered_map
в C ++ и являются частью стандарта C ++ 11 , который, вероятно, уже поддерживается вашей компилятором / std lib (проверьте версию и документацию вашего компилятора). Они были впервые доступны в C ++ TR1 (std::tr1::unordered_map
)
Если ваши ключи довольно близко распределены, вы можете даже использовать простой массив и использовать ключ в качестве индекса. Когда дело доходит до чистой скорости, ничто не сравнится с индексацией в массиве. OTOH, если ваше распределение ключей слишком случайное, вы бы потратили много места.
Если вы храните свои записи как указатели , их перемещение обходится дешево, и альтернативой может быть сохранение ваших данных отсортированными по ключу в векторе:
typedef std::vector< std::pair<unsigned int, record_t*> > my_records;
Из-за лучшей локализации данных, которая предположительно хорошо сочетается с кэшем процессора, простой std::vector
часто работает лучше, чем другие структуры данных, что теоретически должно иметь преимущество. Его слабое место - вставка / удаление с середины. Однако в этом случае в 32-битной системе это потребует перемещения записей по 2 * 32-битному POD, что, вероятно, будет реализовано вашей реализацией путем вызова встроенных функций ЦП для перемещения памяти.