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/194444914https://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++); }

浙公网安备 33010602011771号