사용자 정의 비교기를 사용하여 집합 컴파일
숫자 대신 사전식 비교로 정렬된 정수 집합을 생성하려고 하면 컴파일 시 문제가 발생할 수 있습니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!