面试题答案
一键面试整体设计架构
- 数据类型特性检测:利用模板元编程技术检测数据类型是否为POD类型。可以通过
std::is_pod
模板来实现。同时,我们可以在编译期获取数据规模,例如通过数组的sizeof
计算元素个数。 - 排序算法选择:根据数据类型特性和数据规模,选择最合适的排序算法。例如,对于小规模数据,插入排序可能更合适;对于大规模数据,快速排序通常性能更好。
- 模板元编程实现:通过模板特化来实现不同排序算法的选择。利用编译期条件判断来决定具体使用哪个算法。
关键模板元编程代码实现
#include <type_traits>
#include <iostream>
// 插入排序实现
template <typename T, size_t N>
void insertionSort(T (&arr)[N]) {
for (size_t i = 1; i < N; ++i) {
T key = arr[i];
size_t j = i - 1;
while (j < N && arr[j] > key) {
arr[j + 1] = arr[j];
--j;
}
arr[j + 1] = key;
}
}
// 快速排序实现
template <typename T, size_t N>
void quickSort(T (&arr)[N], size_t low, size_t high) {
if (low < high) {
T pivot = arr[high];
size_t i = low - 1;
for (size_t j = low; j < high; ++j) {
if (arr[j] <= pivot) {
++i;
std::swap(arr[i], arr[j]);
}
}
std::swap(arr[i + 1], arr[high]);
size_t pi = i + 1;
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
// 通用排序模板,根据数据类型特性和规模选择算法
template <typename T, size_t N>
struct SortSelector {
static void sort(T (&arr)[N]) {
if constexpr (std::is_pod<T>::value && N <= 16) {
insertionSort(arr);
} else {
quickSort(arr, 0, N - 1);
}
}
};
// 测试代码
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
SortSelector<int, sizeof(arr) / sizeof(arr[0])>::sort(arr);
for (int num : arr) {
std::cout << num << " ";
}
return 0;
}
上述代码中:
insertionSort
和quickSort
分别实现了插入排序和快速排序。SortSelector
模板结构体根据数据类型是否为POD类型以及数据规模(这里以16为界限)选择合适的排序算法。main
函数测试了排序功能,通过SortSelector
调用合适的排序算法对数组进行排序。