具有<类可比>的模板C++

Templates with <class Comparable> in C++

本文关键字:gt C++ lt 具有      更新时间:2023-10-16

我正在尝试比较算法。我不熟悉C++。我想创建一个 main,我将在其中包含下面的代码作为标题。不过,我不完全了解"模板类可比"是什么。

#include <vector>
using namespace std;
template <class Comparable> 
void SelectionSort(vector<Comparable> & nums, int low, int high)
{
    for (int i = low; i <= high-1; i++) {
        int indexOfMin = i;                     // traverse the list to
        for (int j = i+1; j <= high; j++) {     // find the index of the
            if (nums[j] < nums[indexOfMin]) {   // next smallest item
                indexOfMin = j;
            }
        }
        Comparable temp = nums[i];              // swap the next smallest
        nums[i] = nums[indexOfMin];             // item into its correct
        nums[indexOfMin] = temp;                // position
    }
}
template <class Comparable> void SelectionSort(vector<Comparable> & nums) 
{
    SelectionSort(nums, 0, nums.size()-1);
}

你的主要排序函数看起来像这样(现在截取"模板"部分(:

void SelectionSort(vector<Comparable> & nums) 
{
    SelectionSort(nums, 0, nums.size()-1);
}

看起来像一个普通的排序函数,作用于可比向量。 但什么是可比的? 想象一下,如果"可比"只不过是"int"的别名(它不是,但想象一下(。 然后你会有这个:

void SelectionSort(vector<int> & nums) 
{
    SelectionSort(nums, 0, nums.size()-1);
}

这是普通的C++代码。 它声明并定义了一个对整数向量进行排序的函数。 很简单。

可比性没有这样的标准含义。 这是您问题中的代码发明的术语。 它由文本template <class Comparable>声明,大致于声明变量的方式。 它类似于"类型变量"。 普通变量表示许多值之一;类型变量表示许多类型之一。

template <class Comparable> void SelectionSort(vector<Comparable> & nums) 
{
    SelectionSort(nums, 0, nums.size()-1);
}

这段代码声明 Comparable 不会自动成为 int、float 或 std::string,而是可以是任何类型的。 若要使用此函数,必须在调用函数时指定所需的类型。 您可以显式执行此操作:

std::vector<int> someints;
SelectionSort<int>(someints);

(这将使"可比"毕竟意味着"int",在那个调用中。

或者你可以省略额外的规范,希望编译器弄清楚:

std::vector<int> someints;
SelectionSort(someints);

您可以根据需要将同一模板用于不同的类型;它不会在任何意义上通过一次使用来"花费":

std::vector<int> someints, moreints;
std::vector<float> somefloats;
SelectionSort(someints);
SelectionSort(somefloats);
SelectionSort(moreints);

出于这样的简单目的,您可以想象 SelectionSort 是一个适用于多种类型的函数,而不仅仅是一种类型。 但实际上它不是一个函数。 它是一整系列的潜在函数,其中一些可以由编译器实例化。 上面的代码调用 SelectionSort 三次,但只有两个 Comparable 类型,因此在后台它创建了两个实际函数。

我一直在谈论可比较作为一个变量,但它不能在模板的实例中变化。 你不能在SelectionSort<int>或类似的事情中做Comparable=float。 它因模板的一个实例而异,而不是在一个实例内。 当模板实例化为实际函数时,Comparable 将替换为为其指定的类型,然后被遗忘;该函数"不知道"它是模板的实例。 它只是一个名称中恰好有尖括号的函数。 我认为。

确实有一些非常强大、复杂、令人费解的事情可以用模板来完成。 但是,您可能不需要为目的了解太多这些内容。

不过,还有一个重要的基本点是,还有模板类。 std::vector 本身就是其中之一。 它们的工作方式与 SelectionSort 等模板函数大致类似:标头<vector>只为所有类型声明一次矢量模板,但随后您可以说std::vector<int>,然后说std::vector<SomeClassIMade>等等,从而自动实例化两个(或多个(实际类。 所有这些类都将像C++向量一样工作,但每个类只知道如何处理自己指定的元素类型,而不会理解任何其他元素类型。