передача значения указателя на функцию main в вспомогательные функции - PullRequest
0 голосов
/ 14 марта 2019

Код ниже кучи сортирует вектор целых чисел от наименьшего к наибольшему.

#include <iostream>
#include <vector>

using namespace std;

void shift_down(vector<int>& heap,int i, int max) {
    int i_big, c1, c2;
    while(i < max) {
        i_big = i;
        c1 = (2*i) + 1;
        c2 = c1 + 1;
        if( c1<max && heap[c1]>heap[i_big] )
            i_big = c1;
        if( c2<max && heap[c2]>heap[i_big] )
            i_big = c2;
        if(i_big == i) return;
        swap(heap[i],heap[i_big]);
        i = i_big;
    }
}

void to_heap(vector<int>& arr) {
    int i = (arr.size()/2) - 1;
    while(i >= 0) {
        shift_down(arr, i, arr.size());
        --i;
    }
}

void heap_sort(vector<int>& arr) {
    to_heap(arr);
    int end = arr.size() - 1;
    while (end > 0) {
        swap(arr[0], arr[end]);
        shift_down(arr, 0, end);
        --end;
    }
}

int main() {
    vector<int> data = {
        12, 11, 15, 10, 9, 1, 2,
        3, 13, 14, 4, 5, 6, 7, 8
    };
    heap_sort(data);
    for(int i : data) cout << i << " ";
}

В настоящее время я пытаюсь передать указатель на функцию bool вспомогательной функции (shift_down), чтобы я мог выбрать способ сортировки кучи, но моя проблема в том, что я не знаю, какие параметры передать функциям, вызывающим эту функцию вспомогательная функция. Это то, что я сейчас пытаюсь сделать с помощью функции shift_down

void shift_down(vector<int>& heap, int i, int max, bool(*sbb)(int n1, int n2)) {
    int i_big, c1, c2;
    while (i < max) {
        i_big = i;
        c1 = (2 * i) + 1;
        c2 = c1 + 1;
        if (c1<max && sbb(heap[i_big], heap[c1]))// calling function pointer
            i_big = c1;
        if (c2<max && sbb(heap[i_big], heap[c2])) // calling function pointer 
            i_big = c2;
        if (i_big == i) return;
        swap(heap[i], heap[i_big]);
        i = i_big;
    }
}

Например, я могу попытаться передать одну из двух функций ниже в main

bool sbb0(int n1, int n2) {
    if (n1 < n2) {
        return true;
    }
    else {
        return false;
    }
}

bool sbb1(int n1, int n2) {
    if (n1 > n2) {
        return true;
    }
    else {
        return false;
    }
}

Думаю, я бы так и сделал:

int main(){
vector<int> data = {
        12, 11, 15, 10, 9, 1, 2,
        3, 13, 14, 4, 5, 6, 7, 8
    };
    heap_sort(data, sbb0);
    for (int i : data) cout << i << " ";
    enter code here
}

Итак, моя проблема в том, что я пытаюсь передать параметр указателя на функцию сверху вниз, но не уверен, как именно это сделать в отношении параметров функций, вызывающих вспомогательные функции. Вся помощь и руководство приветствуются.

...