Какой контейнер выбрать - PullRequest
2 голосов
/ 08 апреля 2011

Я думал о хранении некоторых предметов ... и теперь я не знаю, что выбрать.

Итак, теперь у меня есть такой код:

std::map<std::string, Object*> mObjects;

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

Почему я выбрал std::string в качестве ключа?Потому что очень легко получить доступ к объектам по их имени, например:

mObjects["SomeObj"];

Итак, моя первая идея:

std::map<int, Object*> mObjects;

, а ключ - это CRC имени объекта:

mObjects[CRC32("SomeObject")];

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

Любые идеи о контейнере, которые я могу использовать?

Итак, опять же, основные моменты:

  • Доступ к объектам по строке, но ключи должны быть целыми числами, а не строкой
  • Сортировка объектов на карте по какой-либо функции

пс. Увеличение допускается.

1 Ответ

0 голосов
/ 08 апреля 2011

Не могу сказать точно, но вы всегда получаете доступ к элементам на карте по буквальной строке? Если это так, то вы должны просто использовать последовательные нумерованные значения с символическими именами и соответствующим размером vector.

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

Ваш комментарий о построении строк подразумевает, что вы передаете C-строки в функцию find снова и снова? Постарайтесь избежать этого, последовательно используя std::string в своем приложении.

Если вы настаиваете на использовании подхода, состоящего из двух частей: я предлагаю хранить все ваши вещи в vector. Затем у вас есть один unordered_map от строки к индексу и еще один vector, который имеет все индексы в основном контейнере. Затем вы сортируете этот второй контейнер индексов, чтобы получить нужный вам порядок. Наконец, когда вы удаляете элементы из главного контейнера, вам нужно очистить оба других двух ссылочных контейнера.

...