Я пытаюсь объединить несколько диапазонов, используя 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) и т. Д. Таким образом, ошибка компиляции больше не является проблемой. Другая идея состоит в том, чтобы скопировать все элементы из каждого диапазона в контейнер и затем отсортировать (если это имеет смысл даже), но это не решение, которое я ищу, но я соглашусь, если это единственный способ.
Когда вы получаете ошибку компилятора, включите его в вопрос. Предпочтительно копировать/вставлять. –
Параметр вариационного шаблона должен быть последним. Вы можете сгруппировать их с помощью 'std :: tuple'. – Jarod42
Он говорит, что дефолт аргумента шаблона не удался, но приведенный выше полный пример, который может использовать любой пользователь. – prestokeys