>백엔드 개발 >C++ >C std::maps에서 사용자 정의 유형을 키로 어떻게 사용할 수 있습니까?

C std::maps에서 사용자 정의 유형을 키로 어떻게 사용할 수 있습니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-24 13:49:14676검색

How Can I Use User-Defined Types as Keys in C   std::maps?

사용자 정의 유형을 std::maps의 키로 사용

문제: 사용자 정의 유형과 함께 맵을 사용할 때 암호화된 컴파일러 오류

C에서 프로그래밍에서 사용자 정의 클래스와 함께 STL 맵을 사용하면 종종 암호 같은 컴파일러 오류가 발생합니다. 특히, 오류 메시지 "'연산자<'와 일치하지 않습니다. in '__x < __y'"는 사용자 정의 유형의 키를 사용하여 요소에 액세스하려고 할 때 일반적입니다.

오류 이해

오류 메시지는 컴파일러가 액세스할 수 없음을 나타냅니다. 연산자 < 사용자 정의 유형의 두 인스턴스를 비교합니다. 이는 기본적으로 STL 맵에서 키 순서를 지정하기 위해 비교 연산자(operator<)가 필요하기 때문입니다. 그러나 사용자 정의 유형으로 작업할 때는 이 연산자를 자동으로 사용할 수 없습니다.

해결책 1: 비교기 함수 객체

연산자를 정의하는 대신< 사용자 정의 유형의 경우 비교기 함수 객체 클래스를 만들 수 있습니다. 이 클래스는 사용자 정의 유형의 상대적 순서를 결정하는 특수 버전의 Operator()를 구현합니다. 그런 다음 이 비교기를 사용하도록 맵을 특수화할 수 있습니다.

struct Class1Compare {
   bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
       return lhs.id < rhs.id;
   }
};

std::map<Class1, int, Class1Compare> c2int;</p>
<h3>해결책 2: std::less 특수화</h3>
<p>또 다른 대안은 사용자 정의 항목에 대해 std::less 템플릿을 특수화하는 것입니다. 유형. 이는 std::less 클래스 내에서 Operator()에 대한 사용자 정의 정의를 제공합니다.</p>
<pre class="brush:php;toolbar:false">namespace std {
    template<> struct less<Class1> {
       bool operator() (const Class1&amp; lhs, const Class1&amp; rhs) const {
           return lhs.id < rhs.id;
       }
    };
}

이 접근 방식을 사용하면 맵이 비교를 위해 std::less로 기본 설정되는 동시에 사용자에 대한 특정 구현을 제공할 수 있습니다. 정의된 유형.

결론

STL 맵 및 사용자 정의 유형으로 작업할 때 키를 비교할 수 있는 방법을 제공하는 것이 필수적입니다. 이는 비교기 함수 객체를 통해 또는 std::less를 특수화하여 달성할 수 있습니다. 이러한 요구 사항을 해결함으로써 개발자는 사용자 정의 유형이 포함된 맵을 키로 효과적으로 활용할 수 있습니다.

위 내용은 C std::maps에서 사용자 정의 유형을 키로 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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