Я думаю, вы можете использовать различные функции компаратора в качестве «опций». И дайте желаемый компаратор функции сортировки, используете ли вы std::sort
или пользовательскую ручную функцию.
Учитывая следующее struct
(которое вы забыли указать):
struct MyStruct
{
std::string name;
int mark;
};
Вы можете определить свои «опции» как функции компаратора:
int mark_cmp(const MyStruct & lhs, const MyStruct & rhs)
{
return lhs.mark < rhs.mark; // Compare by mark
}
int name_cmp(const MyStruct & lhs, const MyStruct & rhs)
{
return lhs.name.compare(rhs.name); // Compare by name
}
Тогда вы можете просто написать:
int main()
{
unsigned int input = 1;
MyStruct arr[5] {{"foo", 5}, {"bar", 6}, {"baz", -9}, {"foobar", 0}, {"foobaz", -3}};
switch(input)
{
case 1: std::sort(arr, arr+5, &name_cmp); // input == 1 ? sort by name
break;
case 2: std::sort(arr, arr+5, &mark_cmp); // input == 2 ? sort by mark
break;
default:;
}
return 0;
}
Примечание: Вам не нужноbreak
после последнего оператора в switch
(в вашем случае после default
нет необходимости break
).
Примечание2: Я использовал необработанный массивбыть ближе к тому, что вы сделали, но я бы посоветовал вам использовать std::array
вместо этого. Или std::vector
, если вам нужен динамический контейнер.
Если вы не можете использовать std::sort
, вы можете создать свою собственную функцию сортировки, которая принимает функцию компаратора в качестве параметров, и она будет работать тоже.