Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli sebagai Pembanding dalam C `std::sort`?

Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli sebagai Pembanding dalam C `std::sort`?

Mary-Kate Olsen
Lepaskan: 2024-12-02 18:00:21
asal
461 orang telah melayarinya

How Can I Use a Member Function as a Comparator in C   `std::sort`?

Melaksanakan Pembanding Fungsi Ahli untuk Isih

Dalam C , mengisih koleksi memerlukan fungsi pembanding. Percubaan untuk menggunakan fungsi ahli sebagai pembanding boleh mengakibatkan ralat penyusunan.

Masalah

Pertimbangkan kelas berikut:

class MyClass {
    int * arr;
    // ...

    doCompare( const int & i1, const int & i2 ) { // uses member variables } 

    doSort() { std::sort(arr,arr+someSize, &doCompare); }
};
Salin selepas log masuk

Menyusun kod ini mungkin menghasilkan ralat:

ISO C melarang mengambil alamat yang tidak layak atau fungsi ahli bukan statik dalam kurungan untuk membentuk penunjuk kepada fungsi ahli.

Penyelesaian

Untuk menyelesaikan isu ini, satu pendekatan ialah membuat doCompare fungsi ahli statik. Walau bagaimanapun, jika doCompare memerlukan akses kepada data MyClass, anda boleh menukar MyClass menjadi functor perbandingan.

Ini boleh dicapai dengan menukar:

doCompare( const int & i1, const int & i2 ) { // use some member variables }
Salin selepas log masuk

kepada:

bool operator () ( const int & i1, const int & i2 ) { // use member variables }
Salin selepas log masuk

Kemudian, panggil fungsi isihan seperti berikut:

doSort() { std::sort(arr, arr+someSize, *this); }
Salin selepas log masuk

Selain itu, doSort kaedah harus mengembalikan nilai, seperti void.

Pilihan lain ialah membungkus fungsi ahli dalam kelas, seperti yang ditunjukkan dalam contoh berikut:

class MyClass {
    struct Less {
        Less(const MyClass& c) : myClass(c) {}
        bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} 
        MyClass& myClass;
    };
    doSort() { std::sort(arr, arr+someSize, Less(*this)); }
};
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli sebagai Pembanding dalam C `std::sort`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan