Порядок сортировки std :: map в зависимости от входного значения

Я знаю, что вы не можете изменить порядок карты после объявления. Вместо этого я пытаюсь это в структуре:

struct MyStruct
{
std::map<int, double>* my_map;

MyStruct(bool dir)
{
if(dir)
{
my_map = new std::map<int, double, std::less<int> >;
}
else
{
my_map = new std::map<int, double, std::greater<int> >;
}
}
}

Это не работает и жалуется, что я меняю тип под else состояние. Это можно обойти? Единственный способ, о котором я могу думать, это написать свой собственный компаратор и создать объект, инкапсулирующий bool dir который кажется излишним.

3

Решение

std::map принимает объект сравнения в качестве параметра шаблона, поэтому для того, чтобы делать то, что вам нужно, вам нужен тип, который вы можете изменить поведение во время выполнения.

    struct MoreOrLess
{
bool useLess;
template <class T, class U>
bool operator()(const T &t, const U &u) const
{
if(useLess) return t < u;
else return t > u;
}
};

struct MyStruct
{
std::map<int, double, MoreOrLess> my_map;

MyStruct(bool dir) :my_map(MoreOrLess{dir}) {}
};

Таким образом, функтор сравнения имеет тот же тип (для использования в std::map) независимо от использования std::less или же std::greater,

5

Другие решения

Вот простой подход, хотя, вероятно, не самый эффективный:

struct MyStruct
{
typedef std::function<bool(int,int)> Predicate;
std::map<int,double,Predicate> my_map;

static Predicate predicateFor(bool dir)
{
if (dir) return std::less<int>();
return std::greater<int>();
}

MyStruct(bool dir) : my_map(predicateFor(dir)) { }
};
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector