Rumah >pembangunan bahagian belakang >C++ >Mengapa `std::sort` Ranap Apabila Menggunakan Fungsi Perbandingan Pesanan Lemah yang Tidak Tegas?

Mengapa `std::sort` Ranap Apabila Menggunakan Fungsi Perbandingan Pesanan Lemah yang Tidak Tegas?

DDD
DDDasal
2024-12-18 13:57:11915semak imbas

Why Does `std::sort` Crash When Using a Non-Strict Weak Ordering Comparison Function?

Mengapa std::mengisih Ranap dengan Bukan pengendali< Fungsi Perbandingan?

Dalam C , std::sort memerlukan fungsi perbandingan yang mematuhi peraturan pesanan lemah yang ketat. Peraturan ini memastikan bahawa fungsi perbandingan kembali benar jika dan hanya jika operan kiri kurang daripada operan kanan.

Pertimbangkan kod yang disediakan:

#include 

struct A {
  A() : a() {}

  bool operator<(const A& other) const {
    return a <= other.a;
  }

  int a;
};

int main() {
  A coll[8];
  std::sort(&coll[0], &coll[8]); // Crash!!!
}

Fungsi perbandingan tersuai mengembalikan < ;= lain.a untuk kes kesamarataan. Ini melanggar peraturan susunan lemah yang ketat, kerana ia menyatakan bahawa dua elemen dianggap sama jika dan hanya jika a == lain.a.

Dengan menukar perbandingan kepada < lain.a, peraturan itu berpuas hati kerana ia kembali benar hanya apabila a benar-benar kurang daripada yang lain.a. Menggunakan susunan yang ketat menghalang algoritma daripada memasuki gelung tak terhingga apabila menghadapi elemen yang sama.

Kesimpulannya, std::isih ranap dengan bukan pengendali< fungsi perbandingan kerana fungsi tersebut melanggar peraturan susunan lemah yang ketat, yang berpotensi membawa kepada gelung tak terhingga. Oleh itu, adalah penting untuk memastikan fungsi perbandingan anda mematuhi peraturan ini untuk mengelakkan tingkah laku yang tidak dijangka.

Atas ialah kandungan terperinci Mengapa `std::sort` Ranap Apabila Menggunakan Fungsi Perbandingan Pesanan Lemah yang Tidak Tegas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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