合并多个排序范围

时间:2014-11-25 16:44:27

标签: c++ sorting merge

我尝试重复使用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));
}

另外,我希望参数的顺序是first1,last1,first2,last2,......,但这是次要的。

编辑:我意识到我的合并逻辑是错误的。我认为这是方法:首先合并[a1,b1],[a2,b2],然后使用得到的合并范围[merged1,merged2]并与[a3,b3]合并,依此类推。因此编译错误不再是问题。另一个想法是将每个范围中的所有元素复制到一个容器中,然后对其进行排序(如果这甚至没有任何意义),但这不是我寻求的解决方案,但如果这是唯一的方法,我会接受它。 / p>

2 个答案:

答案 0 :(得分:0)

问题是每个模板中不能有多个可变参数。

你怎么知道一个人在哪里开始而另一个人在哪里结束?

答案 1 :(得分: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
}

我仍然想知道如何在我的开篇文章中使用原始签名,因为该签名遵循std :: merge(仅使用迭代器)的精神,并使用输出迭代器推广输出容器。 / p>