Rumah >pembangunan bahagian belakang >C++ >Mengapa Adakah `std::sort` Ranap dengan Pengendali Kurang Ketat Yang Tidak Tegas?
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; }
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 '<'):
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 } };
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!