C++根据STL容器迭代器获取容器元素类型

当我仿照STL的排序函数sort写一个自己的归并排序的函数时,而传入的参数是STL容器迭代器(指针),由于使用函数模板,则迭代器类型可变,那么如何根据STL容器迭代器获取该容器存储元素类型?

假设数组A和数组B分别定义为

const int N = 10;

vector<int> A(N);

vector<double> B(N);

MergeSort函数声明为

template <typename Iterator>

MergeSort(Iterator begin, Iterator end);

那么 begin 和 end 的类型就是 vector<int>::iterator 或 vector<double>::iterator(或者其他),定义一个和数组中元素类型一致的变量的做法如下:

#include<iterator>

template <typename Iterator>

MergeSort(Iterator begin, Iterator end)

{

  typedef typename iterator_traits<Iterator>::value_type var_type;

  var_type x = *begin;

}

当使用 MergeSort(A.begin(), A.end()) 时 var_type 就是 int,使用 MergeSort(B.begin(), B.end()) 时,var_type 就是 double.

注意,通常情况下,你会在.h文件中声明函数和类,而将它们的定义放置在一个单独的.cpp文件中。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。

参考博客:

https://zhuanlan.zhihu.com/p/194444914
https://blog.csdn.net/zhengqijun_/article/details/81159433

完整函数实现:

// 函数声明
template <typename Iterator>
void myMergeSort(Iterator begin, Iterator end);


// 函数定义
// 归并排序
template <typename Iterator>
void Merge(Iterator begin, Iterator mid, Iterator end);

template <typename Iterator>
void myMergeSort(Iterator begin, Iterator end)
{
    if (begin == end)
        return;
    if (begin + 1 < end)
    {
        int n = end - begin; // 数组长度
        Iterator mid = begin + n / 2;
        myMergeSort(begin, mid);
        myMergeSort(mid, end);
        Merge(begin, mid, end);
    }
}

template <typename Iterator>
void Merge(Iterator begin, Iterator mid, Iterator end)
{
    int n1 = mid - begin, n2 = end - mid;
    typedef typename iterator_traits<Iterator>::value_type value_type;
    vector<value_type> L(begin, mid), R(mid, end);
    Iterator k = begin, i = L.begin(), j = R.begin();
    while (i < L.end() && j < R.end())
    {
        if (*i < *j)
            *(k++) = *(i++);
        else
            *(k++) = *(j++);
    }
    while (i < L.end())
        *(k++) = *(i++);
    while (j < R.end())
        *(k++) = *(j++);
}

 

posted @ 2023-03-10 15:51  Triphan  阅读(123)  评论(0)    收藏  举报