如何使用数组通过引用对对象进行排序? (以一种不那么愚蠢/复杂的方式。)

时间:2015-12-18 01:18:49

标签: c++ arrays pointers object reference

我写了这个,还有它的废话。我现在整整都在编写代码,所以请礼貌。以下代码的编写完全是因为在我开始学习更高级的功能之前,我尝试熟悉语言本身。

我的问题很广泛。

在函数" sort_entries()"我根据从对象本身拉出的值,使用bubblesort来混合数组中的对象引用。

但是,我想知道是否有更简单的方法可以做到这一点?

事实上,我也想知道是否有更简单的方法来跟踪对象,而不是通过一系列指针来引用它们,因为坦率地说,我不喜欢绕过指针。

#include <iostream>
#include <stdio.h>
#include <new>
#include <cstring>
using namespace std;

using namespace std;

class Person {
    int person_num;
    int waffles_eaten;

public:

    Person(int p_num, int waffles)
    {
        person_num = p_num;
        waffles_eaten=waffles;

        if(person_num == p_num && waffles_eaten == waffles)
        {
            printf("Entry #%i created. Waffles eaten = %i\n",    person_num, waffles_eaten);
        }
    }
    int get_num()
    {
        return person_num;
    }

    int get_eaten()
    {
        return waffles_eaten;
    }

};

/* ****************************** */

int num_entries()
{
    cout<<"How many entries to create?: ";
    int count;
    cin>>count;
    return count;
}

void create_entry(Person **registry, int count)
{
    int eaten;
    for(int i =0; i<count; i++)
    {
        printf("Person #%i: Waffles eaten? \n", i);
        cin>>eaten;
        registry[i] = new Person(i, eaten);
    }

}

void view_entries(Person **registry, int count)
{
    for(int i=0; i<count; i++)
    {
        printf("Person #%i ate %i waffles\n", (registry[i])->get_num(), (registry[i])->get_eaten() );
    }

}

void delete_entries(Person **registry, int count)
{
    for(int i=0; i<count; i++)
    {
        delete [] registry[i];
    }
}

void cpy_reg(Person **registry, Person **sorted_reg, int count)
{
    for(int i=0; i<count; i++)
    {
        sorted_reg[i] = registry[i];
    }
}

void display_data(Person **sorted_reg, count int)
{

}


void sort_entries(Person **registry, Person **sorted_reg, int count) // Need to figure why this actually works
{
    cpy_reg(registry, sorted_reg, count); // copy the contents of registry[] to sorted_reg[]

    cout<<"Sorted List"<<endl;
    cout<<"------------"<<endl;

    /* does magical sorting stuff */

    int i, j;
    Person *temp;

    for(i=0; i<count; i++)
    {
        for(j=i+1; j<count; j++)cl
        {
            if( ((sorted_reg[i])->get_eaten() ) > ((sorted_reg[j])->get_eaten()) ) 
            {
                temp = *(sorted_reg + j);
                *(sorted_reg+j) = *(sorted_reg+i);
                *(sorted_reg+i) = temp;
            }
        }
    }
}

void print_values(Person **reg, int count)
{
    for(int i=0; i<count; i++)
    {
        printf("Entry #%i, --> %i waffles\n", i, (reg[i])->get_eaten() ); 
    }
}

bool ask_to_sort()
{
    string in;
    bool out;
    cout<<"Sort entries, and see data about them? (Y/N)"<<endl;
    cin>>in;
    if( in=="y" || in =="Y")
    {
        return true;
    }else if(in=="n"||in=="N")
    {
        cout<<"Exiting"<<endl;
    }
    else {
        cout<<"Enter Y/N"<<endl;
    }
}

/* **************************** */  

int main()
{
    int count = num_entries();
    Person *registry[count];
    Person *sorted_reg[count];
    create_entry(registry, count);
    view_entries(registry, count);

    if(ask_to_sort())
    {
        sort_entries( registry, sorted_reg, count);
    }

    print_values(sorted_reg, count);

    delete_entries(registry, count);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

正如其他人所提到的,在C ++中创建可变长度数组并不是有效的。 这些时间有std::vector,您应该使用它。

所以不要这样:

Person *registry[count];

你应该这样做:

std::vector<Person> registry(count);

当你可以使用Person实例时,没有必要使用指针,它使代码更容易理解和维护。

因此,要在sort函数中交换两个项目,而不是:

temp = *(sorted_reg + j);
*(sorted_reg+j) = *(sorted_reg+i);
*(sorted_reg+i) = temp;

这样做:

swap(sorted_reg[i], sorted_reg[j])

只是交换价值。

毕竟,要对矢量进行排序,您可以依赖STL's sort function。您需要为operator<()结构定义一个小于运算符(Person)。