【问题标题】:How to pass an array of structure by reference for sorting?如何通过引用传递结构数组进行排序?
【发布时间】:2019-10-16 12:04:52
【问题描述】:

在这段代码中,我正在创建一个结构数组并尝试根据“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;
}

【问题讨论】:

  • 需要语言标签
  • 通过引用将其作为任何数组传递:void sort_process( process (&amp;)[len])len 必须是 cnostexpr
  • 顺便说一下,process p[n]; 不是标准的 C++。您必须提供恒定大小或更好的大小:如果您需要动态大小的数组,请使用 std::vector

标签: c++ arrays reference structure


【解决方案1】:

您可以在标题&lt;algorithm&gt; 中简单地使用std::sort

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 限定符来禁止修改指针,因为它不是副本而是对原始指针的引用

但在我看来,在这里传递参考信息并没有真正获得任何好处。

【讨论】:

    【解决方案2】:

    好像你害怕动态数组和指针。试试这个:

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-07
      • 2014-12-13
      • 2021-11-24
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2020-03-02
      • 2010-12-21
      相关资源
      最近更新 更多