

std::sortについての質問です。ダブルポインター（ポインターのポインター）をアルファベット順で並び替えたいです。それにあたり、以下のプログラムを作りました。しかしながらcomparison()がうまくいっていないようなのです。どう変更したら上手くいくかわかる方いましたら、お願いします。

問題はcomparison()に関してのことだと思います。このプログラムを実行するとエラーが出てしまいます。そのエラーは以下のようなものです。  
error C2664: 'bool (Student &,Student &)': 引数 2 を 'Student *' から 'Student &'
へ変換できません。  
変換がうまくっていないのだと思います。  
また、sort(list, list+size, comparison); を sort((*list), (*list+size),
comparison);に変えたところコンパイルはできましたが、size分の情報を入れ終わるとバグが発生して止まってしまいます。  
これらの情報をもとに解決できる方いましたらよろしくお願いします。  
ポインターをクラスと一緒につかっているので念のため、クラスの情報も載せています。わかる方いましたらよろしくお願いします。

[code]

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    class Student
    {
    private:
        string name;
        int age;
    public:
        Student(){name = ""; age = 0;}
        Student(string str, int num){name = str; age = num;}
    
        string getName() const {return name;}
        int getAge() const {return age;}
    };
    
    Student * createStudent()
    {
        string name;
        int age;
    
    
        cout << "Enter name and age" << endl;
        cin >> name;
        cin >> age;
        Student * student = new Student(name, age);
    
    
        return student;
    }
    
    void display(Student ** const list, int size)
    {
        for(int i = 0; i < size; i++)
        {
            cout << list[i]->getName() << " : " << list[i]->getAge() << endl;
        }
    }
    
    bool comparison(Student &list1, Student &list2)
    {
        return list1.getName() < list2.getName();
    }
    
    int main()
    {
    
        int size = 3;
    
        Student ** list = new Student * [size];
    
        for(int i = 0; i < size; i++)
        {
            list[i] = createStudent();
        }
        sort(list, list+size, comparison);
        display(list, size);
    
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2021-05-07T12:15:48.667
75724
2021-05-07T13:23:12.107
2021-05-07T12:57:36.247
45177
45177
question
c++
std::sort でダブルポインターを並び替えたい


エラーメッセージが意味することは、`comparison()`の引数の型は`Student&`ではなく`Student*`
にしなければならない、ということです。ソート対象が`Student*`の配列ですから、これは変更できません。


CC BY-SA 4.0
2021-05-07T13:19:49.000
75726
2021-05-07T13:19:49.000
3475
75724
answer


`sort`の比較関数は、引数に **配列の要素** を2つ受け取るものを指定します。  
`Student ** list`は二重ポインタの形になっていますが、実のところ、要素の型が`Student *`の配列です。  
なので、比較関数は`Student *`を引数に取る必要があります。

`comparison`を、

[code]

    bool comparison(Student *a, Student *b) {
        /**/
    }
    
[/code]

となるようにしてください。

* * *

[余談]  
比較関数が配列の要素を参照で受け取ることもできます。 **配列の要素の型が`Student`の場合は**、提示コードの `comparison`
の書き方になります。この場合と混乱したのかもしれません。

比較関数が参照型やポインタではなく値を受け取った場合、ソート中に要素を比較するたびに値のコピーが行われ、処理が遅くなる可能性があります。それを避けるために、クラスや構造体を渡すときは参照型で渡すことが多いです。


CC BY-SA 4.0
2021-05-07T13:23:12.107
75727
2021-05-07T13:23:12.107
20885
75724
answer