Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyusun Set dengan Betul dengan Pembanding Tersuai dalam C?

Bagaimana untuk Menyusun Set dengan Betul dengan Pembanding Tersuai dalam C?

Barbara Streisand
Barbara Streisandasal
2024-12-21 00:56:10996semak imbas

How to Correctly Compile a Set with a Custom Comparator in C  ?

Set Penyusunan dengan Pembanding Tersuai

Apabila cuba mencipta set integer yang disusun mengikut perbandingan leksikografi dan bukannya angka, isu boleh timbul apabila menyusun dengan g .

Ralat yang dihadapi adalah disebabkan oleh jenis parameter templat yang salah untuk set. Dalam kod yang disediakan:

set<int64_t, lex_compare> s;

lex_compare bukan jenis tetapi fungsi. Untuk membetulkannya, kita perlu mencipta objek pembanding mengikut keperluan templat C.

Penyelesaian C Moden

1. Penyelesaian C 20:

auto cmp = [](int64_t a, int64_t b) { return ... };
std::set<int64_t, decltype(cmp)> s;

Lambdas boleh digunakan sebagai pembanding dalam C 20. Lambda harus mengembalikan nilai boolean yang menunjukkan susunan unsur.

2 . Penyelesaian C 11:

auto cmp = [](int64_t a, int64_t b) { return ... };
std::set<int64_t, decltype(cmp)> s(cmp);

Dalam C 11, lambda mesti dihantar sebagai hujah kepada pembina set.

Penyelesaian Tradisional

3. Penunjuk Fungsi:

bool cmp(int64_t a, int64_t b) {
    return ...;
}
std::set<int64_t, decltype(cmp)*> s(cmp);

4. Struktur dengan Operator():

struct cmp {
    bool operator() (int64_t a, int64_t b) const {
        return ...
    }
};

std::set<int64_t, cmp> s;

5. Struktur daripada Fungsi Boolean:

bool cmp(int64_t a, int64_t b) {
    return ...;
}

#include <type_traits>
using Cmp = std::integral_constant<decltype(&cmp), &cmp>;
std::set<int64_t, Cmp> set;

Atas ialah kandungan terperinci Bagaimana untuk Menyusun Set dengan Betul dengan Pembanding Tersuai dalam C?. 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