> 백엔드 개발 > C++ > C에서 `std::map`을 값별로 효율적으로 정렬하려면 어떻게 해야 합니까?

C에서 `std::map`을 값별로 효율적으로 정렬하려면 어떻게 해야 합니까?

DDD
풀어 주다: 2024-12-02 09:29:10
원래의
138명이 탐색했습니다.

How Can I Efficiently Sort a `std::map` by Value in C  ?

값으로 std::map 정렬

키가 아닌 값으로 std::map을 정렬하는 것은 일반적인 요구 사항입니다. 다양한 프로그래밍 시나리오. 이 기사에서는 사용자 정의 템플릿 함수를 사용하여 맵에서 키와 값 쌍을 뒤집어 이 문제에 대한 우아한 솔루션을 제공합니다.

쌍 및 맵 뒤집기를 위한 사용자 정의 템플릿 함수

제공된 솔루션에는 두 가지 사용자 정의 템플릿 함수인 Flip_pair() 및 Flip_map()이 포함됩니다. Flip_pair() 함수는 한 쌍의 값을 가져와 뒤집어서 교환된 값이 포함된 새 쌍을 만듭니다.

template<typename A, typename B>
std::pair<B,A> flip_pair(const std::pair<A,B> &p)
{
    return std::pair<B,A>(p.second, p.first);
}
로그인 후 복사

flip_map() 함수는 Flip_pair() 함수를 활용하여 모든 키를 뒤집습니다. 소스 맵의 값 쌍을 반환하고 뒤집힌 쌍이 있는 새 멀티맵을 반환합니다.

template<typename A, typename B>
std::multimap<B,A> flip_map(const std::map<A,B> &src)
{
    std::multimap<B,A> dst;
    std::transform(src.begin(), src.end(), std::inserter(dst, dst.begin()), 
                   flip_pair<A,B>);
    return dst;
}
로그인 후 복사

예 사용법

std::map을 값별로 정렬하려면 Flip_map() 함수를 사용하여 반전된 쌍으로 새 멀티맵을 생성할 수 있습니다. 이 멀티맵은 소스 맵의 이전 값을 기준으로 정렬됩니다.

std::map<int, double> src;

...    

std::multimap<double, int> dst = flip_map(src);
// dst is now sorted by what used to be the value in src!
로그인 후 복사

C 11 이상에 대한 일반 연관 소스

표준에 대한 대체 연관 컨테이너의 경우: :map(예: std::unordered_map), 보다 일반적인 함수를 사용하여 std::map과 std::unordered_map 소스.

// flips an associative container of A,B pairs to B,A pairs
template<typename A, typename B, template<class,class,class...> class M, class... Args>
std::multimap<B,A> flip_map(const M<A,B,Args...>& src)
{
    std::multimap<B,A> dst;
    std::transform(src.begin(), src.end(),
                   std::inserter(dst, dst.begin()),
                   flip_pair<A,B>);
    return dst;
}
로그인 후 복사

이 함수는 std::map, std::unordered_map 등과 같은 필수 템플릿 매개변수를 지원하는 모든 연관 컨테이너와 함께 사용할 수 있습니다.

위 내용은 C에서 `std::map`을 값별로 효율적으로 정렬하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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