Я реализую merge_sort
, Поскольку слияние не может быть сделано на месте (согласно моим текущим знаниям), я должен объявить temporary array
хранить значения при объединении.
Поскольку это универсальный алгоритм, тип данных может быть любым.
Какое может быть возможное решение?
Отв. Один из способов сделать это — взять другой аргумент шаблона T и получить тип данных, но я действительно не хочу менять структуру своей функции как и те, что я нашел на STL.
Вот мой код:
template <class RandomAccessIterator>
void merge (RandomAccessIterator first,int N1,RandomAccessIterator second,int N2)
{
int i,j,k;
// How to declare the sorted_list array when data type is not known....
i = 0; // Inedex Of The First List
j = 0; // Index Of The Second List
k = 0; // Index Of The Sorted List
while (i<N1 && j<N2)
{
if (first[i] < second[j])
sorted_list[k++] = first[i++];
else
sorted_list[k++] = second[j++];
}
if (i == N1)
{
while (j < N2)
sorted_list[k++] = second[j++];
}
else
{
while (i < N1)
sorted_list[k++] = first[i++];
}
}
template <class RandomAccessIterator>
void merge_sort (RandomAccessIterator begin,RandomAccessIterator end)
{
int N = end - begin + 1;
int N1,N2;
if (N == 1)
return;
RandomAccessIterator mid = (begin + end)/2;
merge_sort (begin,mid);
merge_sort (mid+1,end);
N1 = end - begin + 1;
N2 = end - mid;
merge (begin,N1,mid+1,N2);
}
Ты можешь использовать std::iterator_traits
чтобы получить тип значения итератора.
В частности, с std::iterator_traits<RandomAccessIterator>::value_type
,
В C ++ 11 вы можете использовать decltype
:
std::vector<decltype(*begin)> tmp_array;