MST

星途 面试题库

面试题:C++函数模板声明版本管理之中等题

在C++中,假设你有一个函数模板,用于对不同类型数组进行排序。随着项目发展,需要对这个函数模板进行版本管理。请简述如何在不破坏现有代码的情况下,通过函数模板重载和命名空间来实现两个不同版本的排序函数模板,一个使用冒泡排序,另一个使用快速排序。
48.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 定义命名空间
    • 首先定义两个命名空间,分别用于冒泡排序版本和快速排序版本。
    namespace bubble_sort_version {
    // 这里放置冒泡排序相关代码
    }
    namespace quick_sort_version {
    // 这里放置快速排序相关代码
    }
    
  2. 函数模板重载
    • 冒泡排序函数模板
      • bubble_sort_version命名空间内定义使用冒泡排序的函数模板。
      namespace bubble_sort_version {
      template <typename T, size_t N>
      void sort(T(&arr)[N]) {
          for (size_t i = 0; i < N - 1; ++i) {
              for (size_t j = 0; j < N - i - 1; ++j) {
                  if (arr[j] > arr[j + 1]) {
                      T temp = arr[j];
                      arr[j] = arr[j + 1];
                      arr[j + 1] = temp;
                  }
              }
          }
      }
      }
      
    • 快速排序函数模板
      • quick_sort_version命名空间内定义使用快速排序的函数模板。
      namespace quick_sort_version {
      template <typename T, size_t N>
      void quickSort(T arr[], int low, int high) {
          if (low < high) {
              int pi = partition(arr, low, high);
              quickSort(arr, low, pi - 1);
              quickSort(arr, pi + 1, high);
          }
      }
      template <typename T, size_t N>
      int partition(T arr[], int low, int high) {
          T pivot = arr[high];
          int i = (low - 1);
          for (int j = low; j < high; j++) {
              if (arr[j] < pivot) {
                  i++;
                  T temp = arr[i];
                  arr[i] = arr[j];
                  arr[j] = temp;
              }
          }
          T temp = arr[i + 1];
          arr[i + 1] = arr[high];
          arr[high] = temp;
          return i + 1;
      }
      template <typename T, size_t N>
      void sort(T(&arr)[N]) {
          quickSort(arr, 0, N - 1);
      }
      }
      
  3. 使用
    • 在需要使用排序的地方,通过命名空间来选择特定版本的排序函数模板。
    int main() {
        int arr[5] = {3, 6, 8, 10, 1};
        bubble_sort_version::sort(arr);
        // 此时arr数组使用冒泡排序进行了排序
        int arr2[5] = {3, 6, 8, 10, 1};
        quick_sort_version::sort(arr2);
        // 此时arr2数组使用快速排序进行了排序
        return 0;
    }
    

这样通过函数模板重载(不同命名空间内的同名函数模板)和命名空间,在不破坏现有代码的情况下实现了两个不同版本的排序函数模板。