Как передать массив структуры по ссылке для сортировки? - PullRequest
0 голосов
/ 16 октября 2019

В этом коде я создаю массив структур и пытаюсь отсортировать массив структур на основе поля «arr_time». У меня проблема с передачей массива структуры по ссылке в функции sort_process () .

#include<iostream>
using namespace std;

struct process {
    public:
    int p_id,arr_time,burst_time,comp_time;
};

void sort_process( process x[],int len)
{
    int i,j;
    process temp;
    for(i=0;i<len;i++)
    {
        for(j=0;j<len-1;j++)
        {
            if(x[j].arr_time > x[j+1].arr_time)
            {
                temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
            }
        }
}


int main()
{
    int n,i=0,j=0,k=0,t=0,flag;
    cout<<"\n Enter number of processes : ";
    cin>>n;
    process p[n];

    for(i=0;i<n;i++)
        initialize(p[i]);   
    sort_process(p,n);  
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Похоже, вы боитесь динамических массивов и указателей. Попробуйте это:

#include<iostream>
using namespace std;

struct process
{
    int p_id, arr_time, burst_time, comp_time;

    void initialize()
    {
        p_id = arr_time = burst_time = comp_time = 0;
    }

    process()
    {
        p_id = arr_time = burst_time = comp_time = 0;
    }

    ~process() {}
};

void sort_process(process*& x, int len)
{
    int i, j;
    process temp;
    for (i = 0; i < len; i++)
    {
        for (j = 0; j < len - 1; j++)
        {
            if (x[j].arr_time > x[j + 1].arr_time)
            {
                temp = x[j];
                x[j] = x[j + 1];
                x[j + 1] = temp;
            }
        }
    }
}

int main()
{
    int n, i = 0, j = 0, k = 0, t = 0, flag;

    cout << "\n Enter number of processes : ";
    cin >> n;

    process* p = new process[n];

    for (i = 0; i < n; i++)
        p[i].initialize();

    sort_process(p, n);

    for (i = 0; i < n; i++)
        p[i].~process();
    delete[] p; p = 0;

    return 0;
}
0 голосов
/ 16 октября 2019

Вы можете просто использовать std::sort в заголовке <algorithm>:

std::sort(p, p+n, [](const process & p1, const process & p2){return p1 < p2}); // Will sort p in ascending order

Но если вы действительно хотите сделать это вручную и передать массив вФункция, вы можете создать функцию как:

void sort_process(process * x, std::size_t len) // copy the pointer
{
    std::sort(x, x+len, [](const process & p1, const process & p2){return p1 < p2;});
}

Но передача process x[], как вы сделали, эквивалентно.

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


Если вы действительно хотите передать его по ссылке, вы можете сделать этоследующим образом:

void sort_process(process * const & x, std::size_t len)
{
    std::sort(x, x+len, [](const process & p1, const process & p2){return p1 < p2;});
}

Я добавил квалификатор const, чтобы запретить изменение указателя, поскольку это не копия, а ссылка на исходный

Но вы этого не делаетедействительно получить что-нибудь, передав ссылку здесь, на мой взгляд.

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