详细解读一下c++模版编程,并举例

C++ 模板编程是一种利用模板机制实现泛型编程的技术。模板允许编写通用的代码,使其能够适用于多种不同类型的数据或对象,从而提高代码的重用性和灵活性。

C++ 模板包括函数模板和类模板两种形式。函数模板是一种定义通用函数的方式,它可以接受不同类型的参数,并在编译时根据实际参数类型生成相应的函数代码。类模板是一种定义通用类的方式,它可以用于创建具有相似行为但操作不同类型数据的类。

下面是一个示例,展示了如何使用函数模板和类模板:

// 函数模板示例
template <typename T>
T maximum(T a, T b) {
    
    
    return (a > b) ? a : b;
}

int main() {
    
    
    int maxInt = maximum(10, 20);  // 使用函数模板,推断出参数类型为 int
    double maxDouble = maximum(3.14, 2.71);  // 使用函数模板,推断出参数类型为 double

    return 0;
}

在上面的示例中,maximum 是一个函数模板,它接受两个参数并返回它们中的最大值。通过使用 typename T,我们定义了一个通用的类型参数 T,它可以表示任意类型。在 main 函数中,我们使用 maximum 函数模板分别传递了两个整数和两个浮点数作为参数,并通过编译器的类型推断机制,自动确定了函数模板的参数类型为 int 和 double,生成了相应的函数代码。

接下来是一个类模板的示例:

// 类模板示例
template <typename T>
class Stack {
    
    
private:
    T data[100];
    int top;

public:
    Stack() : top(-1) {
    
    }

    void push(T value) {
    
    
        data[++top] = value;
    }

    T pop() {
    
    
        return data[top--];
    }
};

int main() {
    
    
    Stack<int> intStack;  // 使用类模板创建一个整数类型的栈
    intStack.push(10);
    intStack.push(20);
    int poppedInt = intStack.pop();

    Stack<double> doubleStack;  // 使用类模板创建一个双精度浮点数类型的栈
    doubleStack.push(3.14);
    doubleStack.push(2.71);
    double poppedDouble = doubleStack.pop();

    return 0;
}

在上面的示例中,Stack 是一个类模板,用于定义一个通用的栈类。通过使用 typename T,我们定义了一个通用的类型参数 T,它可以表示任意类型。在 main 函数中,我们使用类模板创建了一个整数类型的栈 intStack 和一个双精度浮点数类型的栈 doubleStack。然后,我们分别对这两个栈进行了入栈和出栈操作。

通过函数模板和类模板,我们可以编写通用的代码,适用于不同类型的数据或对象,从而提高代码的灵活性和重用性。模板编程在实际开发中广泛应用于容器类、算法库和通用数据结构等领域。

下面是一个更复杂的示例,展示了如何使用模板来实现一个通用的排序算法:

#include <iostream>
#include <vector>

// 通用的排序算法模板
template <typename T>
void bubbleSort(std::vector<T>& arr) {
    
    
    int n = arr.size();
    for (int i = 0; i < n - 1; i++) {
    
    
        for (int j = 0; j < n - i - 1; j++) {
    
    
            if (arr[j] > arr[j + 1]) {
    
    
                std::swap(arr[j], arr[j + 1]);
            }
        }
    }
}

int main() {
    
    
    std::vector<int> intArr = {
    
    5, 2, 8, 1, 9};
    bubbleSort(intArr);
    std::cout << "Sorted int array: ";
    for (int num : intArr) {
    
    
        std::cout << num << " ";
    }
    std::cout << std::endl;

    std::vector<double> doubleArr = {
    
    3.14, 2.71, 1.618, 0.577};
    bubbleSort(doubleArr);
    std::cout << "Sorted double array: ";
    for (double num : doubleArr) {
    
    
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}
在上面的示例中,我们定义了一个名为 bubbleSort 的函数模板,它接受一个 std::vector 类型的参数,并使用冒泡排序算法对该向量进行排序。

在 main 函数中,我们分别创建了一个整数类型的向量 intArr 和一个双精度浮点数类型的向量 doubleArr。

然后,我们调用 bubbleSort 函数模板来对这两个向量进行排序。由于函数模板的存在,我们无需为不同类型的向量编写多个排序函数,而是可以通过相同的模板代码在编译时生成适当类型的排序代码。

最后,我们在控制台输出排序后的整数向量和双精度浮点数向量。

这个示例展示了如何使用模板来编写通用的排序算法,使其能够适用于不同类型的容器。通过模板,我们可以实现一次编写,多次使用的代码,提高了代码的重用性和灵活性。

猜你喜欢

转载自blog.csdn.net/zhangzhechun/article/details/133803483