2014-11-25 3 views
0

std :: merge를 반복적으로 사용하여 여러 범위를 병합하려고합니다. 그것은 템플릿 인수 공제가 실패했다고 말합니다. 왜 컴파일되지 않는지 설명 할 수 있습니까? 문제는 여러 팩을 사용하고 있습니까?여러 개의 정렬 된 범위 병합

#include <algorithm> 
#include <vector> 

template <typename OutputIterator> 
OutputIterator multi_merge (OutputIterator result) {return result;} 

template <typename InputIterator1, typename InputIterator2, typename OutputIterator, 
    typename... InputIterators1, typename... InputIterators2> 
OutputIterator multi_merge (InputIterator1 first1, InputIterators1... firsts1, 
InputIterator1 last1, InputIterators1... lasts1, 
InputIterator2 first2, InputIterators2... firsts2, InputIterator2 last2, 
InputIterators2... lasts2, OutputIterator result) { 
    // incorrect algorithm deleted 
    return multi_merge (firsts1..., lasts1..., firsts2..., lasts2..., result); 
} 

int main() { 
    std::vector<int> a = {3,4,6,1,2}, b = {6,8,9,2}, c = {6,7,4,5,2}, result; 
    std::sort (a.begin(), a.end()); 
    std::sort (b.begin(), b.end()); 
    std::sort (c.begin(), c.end()); 
    multi_merge (a.begin(), b.begin(), c.begin(), a.end(), b.end(), c.end(), 
     std::back_inserter(result)); 
} 

또한, 나는 대신 ... 주문 첫번째 1, last1, first2, last2에로 인수를하고자하지만 사소한 일이다.

편집 : 내 병합 논리가 잘못되었음을 알았습니다. 이것이 방법이라고 생각합니다. [a1, b1]을 [a2, b2]와 병합 한 다음 결과 병합 범위 [merged1, merged2]를 사용하고 [a3, b3] 등과 병합합니다. 따라서 컴파일 오류는 더 이상 문제가되지 않습니다. 또 다른 아이디어는 각 범위의 모든 요소를 ​​컨테이너에 복사 한 다음 정렬하는 것입니다 (그렇다고해도 말이되는 경우).하지만 이는 내가 찾는 해결책이 아니지만 그것이 유일한 방법이면 받아 들일 것입니다.

+0

컴파일러 오류가 발생하면 질문에 포함하십시오. 복사/붙여 넣기가 바람직합니다. –

+0

가변성 템플릿 매개 변수는 마지막 매개 변수 여야합니다. 'std :: tuple'을 사용하여 그들을 그룹화 할 수 있습니다. – Jarod42

+0

템플릿 인수 공제가 실패했다고 말하지만 위의 내용은 누구나 사용할 수있는 완전한 예입니다. – prestokeys

답변

0

문제는 각 템플릿에 하나 이상의 가변성을 가질 수 없다는 것입니다.

어디에서 시작하고 다른 끝을 알 수 있습니까?

0

좋아, 필자의 오프닝 포스트에서 기능 서명을 변경했습니다. 그리고 지금은 효과가 있습니다.

#include <iostream> 
#include <vector> 
#include <array> 
#include <algorithm> 

template <typename Container> 
std::vector<typename Container::value_type> multi_merge (const Container& container) { 
    return container; 
} 

template <typename Container1, typename Container2, typename... Containers> 
std::vector<typename Container1::value_type> multi_merge (const Container1& container1, 
const Container2& container2, const Containers&... containers) { 
    std::vector<typename Container1::value_type> v; 
    auto it = std::merge (container1.begin(), container1.end(), container2.begin(), 
     container2.end(), std::back_inserter(v)); 
    return multi_merge (v, containers...); 
} 

int main() { 
    std::vector<int> a = {3,4,6,1,2}, b = {6,8,9,2}, c = {6,7,4,5,2}, d = {3,2,4}; 
    std::array<int,6> e = {5,6,2,7,1,3}; 
    std::sort (a.begin(), a.end()); 
    std::sort (b.begin(), b.end()); 
    std::sort (c.begin(), c.end()); 
    std::sort (d.begin(), d.end()); 
    std::sort (e.begin(), e.end()); 
    const std::vector<int> result = multi_merge (a, b, c, d, e); 
    for (int x : result) std::cout << x << ' '; // 1 1 2 2 2 2 2 3 3 3 4 4 4 5 5 6 6 6 6 7 7 8 9 
} 

나는 아직도 그것이 그 서명 (단 반복자를 사용) 표준 : 병합의 정신에 따르기 때문에,하지만 내 오프닝 게시물에 원래 서명 수행 및과 출력 컨테이너를 일반화 될 것이다 궁금해 출력 반복자.