如何在数据类型未知时声明数组

时间:2015-01-23 20:54:53

标签: c++ generics custom-data-type

我正在实施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);
}

2 个答案:

答案 0 :(得分:3)

您可以使用std::iterator_traits来获取迭代器值类型。

具体来说,std::iterator_traits<RandomAccessIterator>::value_type

答案 1 :(得分:2)

在C ++ 11中,您可以使用decltype

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