> 백엔드 개발 > C++ > `std::map`에서 사용자 정의 유형을 키로 사용할 때 알 수 없는 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

`std::map`에서 사용자 정의 유형을 키로 사용할 때 알 수 없는 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-12-22 07:53:10
원래의
112명이 탐색했습니다.

Why Do I Get Cryptic Errors When Using User-Defined Types as Keys in `std::map`, and How Can I Fix Them?

사용자 정의 유형을 키로 사용하여 std::Map을 사용하는 방법: 암호 오류 및 대체 접근 방식 이해

소개

사용자 정의 클래스를 키로 사용하여 STL 맵을 활용하려고 할 때 프로그래머는 다음과 같은 문제를 겪을 수 있습니다. 비밀스러운 오류 메시지가 진행을 방해합니다. 이 기사에서는 이 오류의 원인을 자세히 알아보고 std::maps를 효과적으로 사용하기 위한 대체 접근 방식을 탐색합니다.

암호적인 오류 및 이유

제공된 예에 설명된 대로 , 사용자 정의 유형을 맵 키로 사용하면 컴파일러가 특정 유형에 적합한 비교 연산자를 찾을 수 없기 때문에 오류가 발생합니다. 이 경우 std::map은 연산자의 가용성에 의존합니다< 요소의 순서를 결정하는 함수

대체 접근 방식

1. 비교기 함수 객체:

오류를 피하는 한 가지 방법은 연산자< 기능. 이 접근 방식을 사용하면 사용자 정의 클래스에 대한 연산자 오버로드를 통해 노출하지 않고 비교 논리를 설정할 수 있습니다.

예를 들어 다음 코드 조각은 비교 함수 개체를 사용하여 Class1 인스턴스를 비교하고 정렬합니다.

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>
<p><strong>2. std::less:</strong></p>
<p>의 특수화 대안적인 접근 방식은 사용자 정의 유형에 대해 특별히 비교 의미를 제공하기 위해 std::less 템플릿을 특수화하는 것입니다. 이는 명시적인 연산자를 노출하지 않고도 std::map의 기본 비교 동작과의 원활한 통합을 보장합니다. overload:</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::maps를 효과적으로 사용할 수 있으므로 명시적인 연산자< STL 맵이 제공하는 유연성과 효율성을 유지하면서 오버로드합니다.

위 내용은 `std::map`에서 사용자 정의 유형을 키로 사용할 때 알 수 없는 오류가 발생하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿