具有<类可比>的模板C++
Templates with <class Comparable> in C++
我正在尝试比较算法。我不熟悉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++向量一样工作,但每个类只知道如何处理自己指定的元素类型,而不会理解任何其他元素类型。
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- C 操作员&gt;&gt;与突变器过载
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- ``这个''不能用this-&gt;指针变量
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 使用shared_ptr<字符串>转换为一个无序集合<字符串>
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到