Rumah > pembangunan bahagian belakang > C++ > Mengapa `std::sort` Saya Ranap? (Dan Cara Memperbaikinya)

Mengapa `std::sort` Saya Ranap? (Dan Cara Memperbaikinya)

Susan Sarandon
Lepaskan: 2024-12-14 16:22:14
asal
761 orang telah melayarinya

Why Does My `std::sort` Crash?  (And How to Fix It)

Memahami Ranap Pengkompil dengan std::sort

Fungsi C Standard Library, std::sort, memainkan peranan penting dalam menyusun data struktur. Walau bagaimanapun, tidak semua fungsi perbandingan berfungsi seperti yang diharapkan dengan std::sort, berpotensi membawa kepada ranap program.

Pertimbangkan coretan kod berikut:

#include <algorithm>

struct A
{
    int a;
};

bool compare(const A& a, const A& b)
{
    return a.a <= b.a; // Corrected from original code (<)
}

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

Masalah:

Dalam kod asal, fungsi perbandingan bandingkan menggunakan a.a <= b.a untuk membandingkan elemen, yang membolehkan elemen yang sama dianggap disusun. Ini melanggar peraturan pemesanan lemah yang ketat yang diperlukan oleh std::sort.

Penyelesaian:

Mengikut peraturan pesanan lemah yang ketat, untuk sebarang unsur A, B, dan C dalam urutan, syarat berikut mesti tahan:

  • Jika A < B, kemudian B > A.
  • Jika A < B dan B < C, kemudian A < C.
  • A tidak boleh sama dengan dirinya sendiri (iaitu, A != A).
  • Fungsi perbandingan asal membandingkan tidak memenuhi peraturan ini kerana ia membenarkan A sama dengan itu sendiri, membawa kepada potensi gelung tak terhingga dalam std::sort. Untuk membetulkannya, fungsi perbandingan perlu digantikan dengan versi yang diperbetulkan yang ditunjukkan dalam coretan kod di atas.

    Atas ialah kandungan terperinci Mengapa `std::sort` Saya Ranap? (Dan Cara Memperbaikinya). 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