簡體   English   中英

對 class 數組進行升序排序

[英]Sorting class array in ascending order

對編程很陌生,需要一些幫助,我希望根據年齡按升序對 class 數組進行排序,但我只能讓代碼按降序工作。 我可能會忽略一些小事情,因為我已經在這方面工作了太久,所以我很感激任何幫助!

#include <iostream>
#include <string>
using namespace std;

class Person 
{
    public:
        string name;
        int age;
    
    
        Person(string name = "empty", int age = 0) 
        {
            setName(name);
            setAge(age);
        }
        void setName(string x) {
            name = x;
        }
        
        string getName() {
            return name;
        }
        void setAge(int y) {
            age = y;
        }
        int getAge() {
            return age;
        }
        void displayinfo()
        {
            cout << "Name: " << name; cout << " Age: " << age << endl;
        }
};
void swap(Person &p, Person &q)
{
 Person temp;
 temp.name = p.name;
 temp.age = p.age;
 p.name = q.name;
 p.age = q.age;
 q.name = temp.name;
 q.age = temp.age;
}

int main() 
{
    
    int userValue;
    Person po("Jessica", 24);
    Person po2("Robert", 49);
    Person po3("Maria", 47);
    Person po4("John", 19);
    Person family[4] = {po,po2,po3,po4}; 
    
    int sort(family[4].getAge()); 
    {
        for(int i = 0; i < 3; i++)
            if (family[i].getAge() < family[i+1].getAge()) 
            {
                swap(family[i], family[i+1]);
            }
        
    }
    for(int i = 0; i < 4; i++)
        family[i].displayinfo();

}

int sort(family[4].getAge()); 不是 function 聲明(並且您不能在另一個函數內部實現 function)。 它實際上是一個變量聲明。 它聲明了一個變量int sort ,該變量使用來自family[4].getAge()的值進行初始化(這是未定義的行為,因為索引 4超出了您的family[]數組的范圍)。

因此,您要聲明一個未使用的sort變量,然后輸入您的for(int i = 0; i < 3; i++)循環,它不會執行數組的完整排序。 對於您正在嘗試的內容,請改用標准std::sort()算法,例如:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

class Person 
{
    public:
        string name;
        int age;
    
        Person(string name = "empty", int age = 0) 
        {
            setName(name);
            setAge(age);
        }

        void setName(string x) {
            name = x;
        }
        
        string getName() const {
            return name;
        }

        void setAge(int y) {
            age = y;
        }

        int getAge() const {
            return age;
        }

        void displayinfo() const
        {
            cout << "Name: " << name; cout << " Age: " << age << endl;
        }
};

int main() 
{
    Person po1("Jessica", 24);
    Person po2("Robert", 49);
    Person po3("Maria", 47);
    Person po4("John", 19);

    Person family[4] = {po1, po2, po3, po4};
    
    std::sort(family, family + 4,
        [](const Person &p1, const Person &p2) {
            return p1.getAge() < p2.getAge(); 
        }
    );

    for(int i = 0; i < 4; i++) {
        family[i].displayinfo();
    }

    return 0;
}

現場演示

請注意,您的family[]數組包含您初始化它的Person對象的副本 為了避免這些副本的開銷,您可以對指針進行排序,例如:

int main() 
{
    Person po1("Jessica", 24);
    Person po2("Robert", 49);
    Person po3("Maria", 47);
    Person po4("John", 19);

    Person* family[4] = {&po1, &po2, &po3, &po4};
    
    std::sort(family, family + 4,
        [](const Person *p1, const Person *p2) {
            return p1->getAge() < p2->getAge(); 
        }
    );

    for(int i = 0; i < 4; i++) {
        family[i]->displayinfo();
    }

    return 0;
}

現場演示

或者,您可以完全擺脫單個p0...對象並直接初始化數組,例如:

int main() 
{
    Person family[4]{
        {"Jessica", 24},
        {"Robert", 49},
        {"Maria", 47},
        {"John", 19}
    };
    
    std::sort(family, family + 4,
        [](const Person &p1, const Person &p2) {
            return p1.getAge() < p2.getAge(); 
        }
    );

    for(int i = 0; i < 4; i++) {
        family[i].displayinfo();
    }

    return 0;
}

現場演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM