> 백엔드 개발 > C++ > 데이터를 복사하지 않고 C에서 여러 벡터를 어떻게 정렬할 수 있나요?

데이터를 복사하지 않고 C에서 여러 벡터를 어떻게 정렬할 수 있나요?

DDD
풀어 주다: 2024-12-05 02:24:09
원래의
665명이 탐색했습니다.

How Can I Sort Multiple Vectors in C   Without Copying Data?

복사하지 않고 C에서 압축된 컨테이너 정렬

사본을 만들지 않고 여러 벡터를 동시에 정렬하는 것은 독특한 과제입니다. 기존 솔루션에서는 데이터를 튜플이나 구조체로 복제해야 하는 경우가 많으며 이는 비효율적입니다. 이 질문은 복사 없이 정렬을 수행하기 위해 C 라이브러리의 기능을 활용하는 우아한 솔루션을 탐구합니다.

문제:

목표는 잠금 단계에서 여러 벡터를 정렬하는 것입니다. , 해당 요소가 쌍을 유지하도록 보장합니다. 벡터를 복사하는 것은 중복되고 바람직하지 않습니다.

실패한 시도:

boost::zip_iterator 및 Boost::range::algorithm::sort는 유망해 보이지만 읽기 전용 및 비임의 액세스 거부 iterators.

답변:

interjay가 제안한 대로 "tupleit.hh" 헤더에서 사용자 정의 TupleIteratorType을 사용하면 내장된 반복자의 제한을 우회할 수 있습니다. 반복자. 이를 통해 압축된 벡터에서 직접 작동하는 사용자 정의 정렬 기능을 정의할 수 있습니다.

여기 데모가 있습니다.

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

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() {

  typedef boost::tuple<int&amp;,double&amp;,long&amp;> tup_t;

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

  auto print = [](tup_t t){ std::cout << t.get<0>() << &quot; &quot; << t.get<1>() << &quot; &quot; << t.get<2>() << std::endl; };

  boost::for_each( zip(a, b, c), print);

  boost::sort( zip(a, b, c), [](tup_t i, tup_t j){ return i.get<0>() > j.get<0>(); });

  for ( auto tup : zip(a, b, c) ) print(tup);

  return 0;
}
로그인 후 복사

이 코드는 벡터를 복사하지 않고 제자리에서 정렬합니다. 사용자 정의 반복자와 "정렬" 기능을 사용하면 필요한 모든 순열이 처리됩니다.

향후 확장:

현재 솔루션은 시퀀스 컨테이너에 적합합니다. 목록과 같은 정렬 가능한 컨테이너로 확장하려면 양방향 반복자를 지원하는 정렬 알고리즘과 함께 RandomAccess 및 양방향 TupleIterator가 필요합니다.

위 내용은 데이터를 복사하지 않고 C에서 여러 벡터를 어떻게 정렬할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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