Rumah > pembangunan bahagian belakang > C++ > Mengapa Adakah `std::sort` Ranap dengan Pengendali Kurang Ketat Yang Tidak Tegas?

Mengapa Adakah `std::sort` Ranap dengan Pengendali Kurang Ketat Yang Tidak Tegas?

DDD
Lepaskan: 2024-12-14 12:29:20
asal
693 orang telah melayarinya

Why Does `std::sort` Crash with a Non-Strict Less-Than Operator?

std::sort Exception dengan Fungsi Perbandingan Tidak Tegas

Program berikut, yang disusun dengan VC 2012, mempamerkan tingkah laku yang tidak dijangka:

#include <algorithm>

struct A {
    int a;
    bool operator<(const A& other) const {
        return a <= other.a; // Potential issue
    }
};

int main() {
    A coll[8];
    std::sort(&coll[0], &coll[8]); // Crash may occur
    return 0;
}
Salin selepas log masuk

Masalah Penjelasan

Isu timbul kerana operator fungsi perbandingan< tidak mematuhi keperluan std::sort dengan ketat. Menurut Perpustakaan Standard C (Sect. 25.3.1.1), std::sort memerlukan fungsi perbandingan yang memenuhi apa yang dipanggil sifat "strict weak ordering". Walau bagaimanapun, fungsi perbandingan dalam program yang diberikan hanya membenarkan elemen dianggap sama tetapi tidak kurang daripada satu sama lain. Ini boleh menyebabkan kekaburan dan berkemungkinan membawa kepada gelung tak terhingga dalam algoritma pengisihan.

Peraturan Susunan Lemah Tegas

Peraturan susunan lemah yang ketat menyatakan bahawa untuk fungsi perbandingan '> ;' (juga terpakai untuk '<'):

  • Jika > b, kemudian b !< a
  • Jika a >= b dan b >= a, maka a == b

    Implikasi untuk Fungsi Perbandingan

    Dalam kod yang diberikan, operator fungsi perbandingan< melanggar peraturan susunan lemah yang ketat kerana ia membenarkan kes di mana unsur boleh sama (a == b) tetapi tidak kurang daripada satu sama lain (bukan < b). Tingkah laku tidak ketat ini melanggar keperluan std::sort dan boleh membawa kepada tingkah laku yang tidak ditentukan, termasuk ranap sistem.

    Penyelesaian

    Untuk menyelesaikan isu, perbandingan fungsi harus diubah suai untuk membandingkan elemen dengan ketat:

    struct A {
        int a;
        bool operator<(const A& other) const {
            return a < other.a; // Strict comparison
        }
    };
    Salin selepas log masuk

    Dengan pengubahsuaian ini, program harus berjalan seperti yang diharapkan tanpa terhempas.

    Atas ialah kandungan terperinci Mengapa Adakah `std::sort` Ranap dengan Pengendali Kurang Ketat Yang Tidak Tegas?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan