Хранение таблицы рекордов, что за контейнер? - PullRequest
4 голосов
/ 19 января 2010

Скажем, у меня таблица рекордов, структурированная как

name score
name score
....

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

Я подумал об использовании map< std::string, int >, но карта не сохранила бы порядок файла. Будет ли vector< pair< std::string, int >> лучше, или есть какая-то упорядоченная карта, которую я могу использовать? Мне также нужен контейнер для повторения имени, если это необходимо. Я думаю, что мультикарта сохраняет один ключ, но допускает несколько значений для этого ключа, а это не то, что мне нужно, поскольку это не сохранит порядок.

Ответы [ 5 ]

7 голосов
/ 19 января 2010

Используйте

std::vector< std::pair< std::string, int > >

решение.

Или, что еще лучше, создайте класс HighScoreEntry и получите std :: vector - тогда вы сможете добавить к нему дополнительные данные позже и добавить код обработки оценки в класс.

Чтобы добавить запись, поместите запись в конец вектора и введите для нее std::sort, просто не забудьте написать оператор сравнения для HighScoreEntry.

class HighScoreEntry
{
public:
   std::string name;
   uint32 score;

   bool operator<(const HighScoreEntry& other) const
   {
       // code that determines ordering goes here
       return score < other.score
   }
};

Таблица рекордов:

std::vector< HighScoreEntry > highscores;

Сортировка:

std::sort( highscores.begin(), highscores.end() );

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

2 голосов
/ 19 января 2010
typedef std::pair<int, int> score_entry; // score, timestamp/serial
typedef std::map<score_entry, std::string, std::greater<score_entry> > score_map;

Он упорядочен по партитуре и метке времени / серии (в порядке убывания) и допускает дублирование одинакового рекорда. (Если вы хотите, чтобы предыдущая метка времени / серийный номер были указаны первыми, введите отрицательные числа.)

Использование серийного номера вместо отметки времени означает, что вы можете разрешить дублирование без использования multimap. Спасибо Стиву Джессопу за предложение!

0 голосов
/ 19 января 2010

Зачем использовать приоритетную очередь?Следует также легко добавлять новые оценки.

0 голосов
/ 19 января 2010

Если вы хотите упорядоченную карту, то вы хотите, чтобы она упорядочивалась по счету, поэтому она должна быть multimap<int, string>, чтобы сохранить порядок и разрешить привязанные результаты.

Это кажется мне глупым, хотя, не говоря уже, не очевидно, что на земле "отображается". Производительность контейнера в таблице рекордов вряд ли когда-либо будет иметь значение, поэтому я бы просто использовал вектор pair<string,int>.

0 голосов
/ 19 января 2010

Мне также нужен контейнер для повторения имени, если необходимо.

Так что вставляйте одно и то же имя в ваш вектор пар дважды. Это действительно так важно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...