>백엔드 개발 >C++ >Boost 또는 Range-v3를 사용하여 C에서 압축된 컨테이너를 정렬하는 방법은 무엇입니까?

Boost 또는 Range-v3를 사용하여 C에서 압축된 컨테이너를 정렬하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-07 01:35:12311검색

How to Sort Zipped Containers in C   Using Boost or Range-v3?

Boost 또는 STL을 사용하여 C에서 압축된 컨테이너 정렬

동기화된 순서를 유지하면서 여러 컨테이너를 동시에 정렬하는 것은 일반적인 과제입니다. 이 질문은 Boost 라이브러리와 STL을 사용하여 데이터를 튜플이나 구조로 복사하는 데 따른 제한 사항을 해결하는 솔루션을 탐색합니다.

근본적인 문제는 배열 참조의 "쌍" 동작에 있습니다. 예상되는 반복자 특성. 이로 인해 참조 유형에서 값 유형 참조를 효과적으로 분리하는 부적합 반복자가 개발되었습니다.

Boost Solution

interjay의 허용된 답변은 " tupleit.hh" 라이브러리는 압축된 파일 정렬을 가능하게 하는 사용자 정의 튜플 반복자를 제공합니다. 컨테이너.

#include "tupleit.hh"
#include <vector>
#include <iostream>
#include <boost/range.hpp>
#include <boost/range/algorithm/sort.hpp>

// Custom zip function
template <typename... T>
auto zip(T&amp;... containers)
    -> boost::iterator_range<decltype(iterators::makeTupleIterator(std::begin(containers)...))> {
  return boost::make_iterator_range(iterators::makeTupleIterator(std::begin(containers)...),
                                      iterators::makeTupleIterator(std::end(containers)...));
}

int main() {
  // Example data
  std::vector<int> a = {1, 2, 3, 4};
  std::vector<double> b = {11, 22, 33, 44};
  std::vector<long> c = {111, 222, 333, 444};

  // Sort zipped containers
  boost::sort(zip(a, b, c), [](auto& i, auto& j) { return i.get<0>() > j.get<0>(); });

  // Print sorted results
  for (auto& tup : zip(a, b, c)) {
    std::cout << tup.get<0>() << " " << tup.get<1>() << " " << tup.get<2>() << std::endl;
  }

  return 0;
}

이 솔루션을 사용하면 시퀀스 컨테이너를 별도의 구조로 복사하지 않고도 정렬할 수 있습니다.

Range-v3 솔루션

대체 접근 방식 STL에 대한 확장을 제안하는 range-v3 라이브러리를 활용하면 우아하고 간결한

#include <range/v3/all.hpp>
#include <iostream>

using namespace ranges;

int main() {
  // Example data
  std::vector<int> a1{15, 7, 3, 5};
  std::vector<int> a2{1, 2, 6, 21};

  // Sort zipped containers
  sort(view::zip(a1, a2), std::less<>{}, &amp;std::pair<int, int>::first);

  // Print sorted results
  for (auto& [x, y] : view::zip(a1, a2)) {
    std::cout << x << " " << y << std::endl;
  }
}

혼합 컨테이너에 대한 고려 사항

제시된 솔루션은 시퀀스형 컨테이너의 정렬을 다루지만 혼합 유형(예: 목록)을 지원하도록 확장합니다. 및 시퀀스)에는 특수한 BidirectionIterator의 개발과 그러한 반복기와 호환되는 정렬 알고리즘의 구현이 필요합니다. 그러나 STL의 std::sort는 BidirectionIterator를 지원하지 않는다는 점은 주목할 가치가 있습니다.

결론적으로 Boost와 range-v3 솔루션은 모두 잠금 단계에서 여러 컨테이너를 정렬하는 효율적이고 사용자 정의 가능한 수단을 제공합니다. C의 데이터 조작에 대한 새로운 가능성.

위 내용은 Boost 또는 Range-v3를 사용하여 C에서 압축된 컨테이너를 정렬하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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