我尝试重复使用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>
答案 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>