복사하지 않고 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&... 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&,double&,long&> 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>() << " " << t.get<1>() << " " << 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!