2015-07-21 3 views
1

Я пишу программу, которая оценивает тонны позиций в настольной игре (т. Е. Othello). Представление моего совета - std::vector. Поскольку такая же позиция может возникать больше времени при обработке, я использую std::set<std::vector> для хранения проверенных позиций.std :: vector as key в std :: set и std :: unordered_set

В перспективе выступлений я не знаю, если это предпочтительнее использовать std::set (который работает изначально потому что std::vector реализует все операторы, необходимые) или std::unordered_set с хорошей хэширования функции (т.е. boost::hash_range(...)).

В альтернативе есть ли другие хорошие решения для достижения одной и той же цели? (Может быть, разные представления на борту [наверняка, если имеется] или разные структуры данных?)

EDIT *************************** *********** РЕДАКТИРОВАТЬ

Это псевдо-код для извлечения платы:

enqueue initial board 
while queue not empty: 
    dequeue a board 
    if board is already examined: //std::set search 
     continue 
    put board in examined boards 
    if board is solved: 
     print solution 
    else: 
     for each possible board that can arise out of this one: 
      add board to end of queue 
+1

Почему бы не вектором векторов? – NathanOliver

+1

Если вы говорите об эффективности, вам нужно измерить, что быстро для вашей проблемы. И 'std :: vector' всегда должен быть кандидатом для сравнения, если это возможно. –

+0

@NathanOliver с проверкой вектора, если эта позиция уже проверена, требует O (n). С помощью набора O (logn) и unsorted_set O (1). Когда n экстремально большой вектор является узким местом –

ответ

1

см

Why on earth would anyone use set instead of unordered_set?

what is the difference between set and unordered_set in C++?

В принципе: если вы не обеспокоены порядком значений, вы, вероятно, должны пойти с unordered_set.

Но как и для всех других проблем с производительностью: когда возникают сомнения -> начните измерение. Выполняйте как «меньше», так и «хеш», затем попробуйте его с обоими классами и проверьте, какая из них лучше (обратите внимание: в этом случае у вас практически нет того же API. Поэтому вам не нужно долго переключаться классы для теста)

+1

Я думаю, что «меньше» уже реализовано для векторов, не так ли? – celticminstrel

+0

@celticminstrel да, это так. нет причин для его определения –

Смежные вопросы