#c #named-parameters
#c #named-parameters
Вопрос:
У меня есть функция сортировки внутри массива классов, и я хотел добиться чего-то подобного в python sort(reverse=True)
. Я хочу показать пользователю, что они могут передавать этот параметр, потому что прямо сейчас arr.bubble_sort(true);
(проверьте код) доза не имеет особого смысла. Я не хочу, чтобы лямбда-функции имели представление о том, как этого добиться.
Любой другой метод также работает, потому что я знаю, что именованных параметров, вероятно, нет в c .
PS: Кстати, я его перегрузил.
С уважением,
// inside class Array
void bubble_sort(bool rev){ //overloaded bubble_sort
if(rev){
int i,j;
for(i=0; i<size-1; i ){
for(j=0; j<size-i-1; j ){
if(arr[j] < arr[j 1]){
std::swap(arr[j], arr[j 1]);
}
}
}
}
else{
int i,j;
for(i=0; i<size-1; i ){
for(j=0; j<size-i-1; j ){
if(arr[j] > arr[j 1]){
std::swap(arr[j], arr[j 1]);
}
}
}
}
}
int main()
{
int n;
std::cin >> n;
Array arr(n); // parameterized constructor initializing array of size n
arr.bubble_sort(true);
arr.print();
return 0;
}
Комментарии:
1. В c нет такой функции, как именованные параметры .
2. Нет, вы не перегрузили
bubble_sort
, по крайней мере, не в коде, который вы показали. Но перегрузка была бы элегантным решением. Или используйте значение по умолчанию дляrev
.3. Здесь можно использовать некоторый параметр времени компиляции
if constexpr
, чтобы избежать дублирования кода.4. Есть ли какая-либо причина, по которой вы используете bubblesort вместо
std::sort
?5. На самом деле я просто не учусь.
Ответ №1:
Просто предоставьте это перегрузкам:
void bubble_sort(std::function<bool<int, int>> cmp) {
...
if(cmp(arr[j], arr[j 1])){
std::swap(arr[j], arr[j 1]);
}
...
}
void bubble_sort(bool rev = false)
{
bubble_sort(rev ? std::greater<int>{} : std::less<int>{});
}
Обратите внимание, что в c используется статический типизированный язык, поэтому перегрузки можно различать по типу аргумента.
Комментарии:
1. Если компилятор недостаточно умен,
cmp
здесь будет виртуальный вызов.2. да, но он новичок, и эта деталь не важна с его точки зрения. Знакомить его с шаблонами было бы излишним.