Не могу отсортировать unordered_set - PullRequest
1 голос
/ 11 мая 2011

У меня есть unordered_set класса ActiveStatusEffect Набор объявлен следующим образом:

boost::unordered_set<StatusEffects::ActiveStatusEffect> ActiveStatusEffects;

ActiveStatusEffect определяется следующим образом:

class ActiveStatusEffect
    {
    public:
        StatusEffect* effect;
        int ReminaingTurns;
        bool operator<(const ActiveStatusEffect& ase) const
        {
            return *effect < *ase.effect;
        }
        bool operator>(const ActiveStatusEffect& ase) const
        {
            return *effect > *ase.effect;
        }
        bool operator==(const ActiveStatusEffect& ase) const
        {
            return *effect == *ase.effect;
        }
        bool operator!=(const ActiveStatusEffect& ase) const
        {
            return !((*this) == ase);
        }
    };

Сравнение StatusEffect - это сравнение уникального целого числа, присваиваемого каждому эффекту состояния.

Однако, если я попытаюсь отсортировать эффекты следующим образом:

std::sort(statusSet.begin(), statusSet.end(), [](StatusEffects::ActiveStatusEffect const &se1, StatusEffects::ActiveStatusEffect const &se2){return se1.effect->GetPriority() < se2.effect->GetPriority();});

Я получаю много ошибок в заголовочном файле алгоритма, например

Ошибка 198, ошибка C2784: '_Base1 :: diff_type std :: operator - (const std :: _ Revranit <_RanIt, _Base> &, const std :: _ Revranit <_RanIt2, _Base2> &) ': не удалось вывести шаблон аргумент для 'const std :: _ Revranit <_RanIt, _Base> & 'from 'boost :: unordered_detail :: hash_const_iterator' c: \ program файлы (x86) \ Microsoft Visual Studio 10,0 \ vc \ include \ алгоритма 3806

Ошибка 199, ошибка C2784: '_Base1 :: diff_type std :: operator - (const std :: _ Revranit <_RanIt, _Base> &, const std :: _ Revranit <_RanIt2, _Base2> &) ': не удалось вывести шаблон аргумент для 'const std :: _ Revranit <_RanIt, _Base> & 'from 'boost :: unordered_detail :: hash_const_iterator' c: \ program файлы (x86) \ Microsoft Visual Studio 10,0 \ vc \ include \ алгоритма 3806

Почему я не могу отсортировать набор? Я совершенно уверен, что это что-то в unordered_set, поскольку удаление попыток сортировки или изменения вектора не приводит к ошибкам.

Ответы [ 2 ]

7 голосов
/ 11 мая 2011

unordered_set не имеет неконстантных итераторов, потому что, если вы можете изменить элемент, на который указывает итератор, вы можете нарушить инварианты набора (уникальность среди других). Кроме того, если вы отсортировали unordered_set, вы больше не сможете искать элемент в контейнере (при условии, что он работает по хешу).

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

5 голосов
/ 11 мая 2011
boost::unordered_set<Foo> a;
a.insert(...);
...

std::set<Foo> b(a.begin(), a.end());

std::set<Foo> c;
std::copy(a.begin(), a.end(), std::inserter(c, c.end());

Вуаля, отсортированный набор.

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