>백엔드 개발 >C++ >C에서 사용자 정의 비교기를 사용하여 집합을 올바르게 컴파일하는 방법은 무엇입니까?

C에서 사용자 정의 비교기를 사용하여 집합을 올바르게 컴파일하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-21 00:56:10996검색

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

사용자 정의 비교기를 사용하여 집합 컴파일

숫자 대신 사전식 비교로 정렬된 정수 집합을 생성하려고 하면 컴파일 시 문제가 발생할 수 있습니다. with g .

발생한 오류는 세트에 대한 잘못된 템플릿 매개변수 유형으로 인해 발생합니다. 제공된 코드에서:

set<int64_t, lex_compare> s;

lex_compare는 유형이 아니라 함수입니다. 이 문제를 해결하려면 C의 템플릿 요구 사항에 따라 비교기 개체를 만들어야 합니다.

Modern C Solutions

1. C 20 솔루션:

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

람다는 C 20에서 비교기로 사용될 수 있습니다. 람다는 요소의 순서를 나타내는 부울 값을 반환해야 합니다.

2 . C 11 솔루션:

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

C 11에서 람다는 집합 생성자에 인수로 전달되어야 합니다.

기존 솔루션

3. 함수 포인터:

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

4. 연산자()를 사용한 구조체:

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

std::set<int64_t, cmp> s;

5. 부울 함수의 구조체:

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;

위 내용은 C에서 사용자 정의 비교기를 사용하여 집합을 올바르게 컴파일하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.