как объявить массив, когда тип данных не известен

Я реализую 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);
}

1

Решение

Ты можешь использовать std::iterator_traits чтобы получить тип значения итератора.

В частности, с std::iterator_traits<RandomAccessIterator>::value_type,

3

Другие решения

В C ++ 11 вы можете использовать decltype:

std::vector<decltype(*begin)> tmp_array;
2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector