C++泛型编程

C++泛型编程

C++泛型编程

泛型编程是一种编程范例,旨在提高代码的重用性、扩展性和性能。C++是一种支持泛型编程的语言,通过模板 (Template) 实现泛型编程。

模板的基本概念

C++中,使用模板可以编写通用的数据结构和算法,使得代码具有更高的通用性。模板可以分为函数模板和类模板。函数模板用于定义通用的函数,类模板用于定义通用的类。

函数模板

函数模板是一种定义通用函数的方法,它在函数定义前面加上关键字 template,并在函数名后面加上尖括号 < >,在尖括号中定义泛型参数。

template <typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

int main() {
    int a = 5, b = 3;
    double c = 7.5, d = 4.2;

    cout << "max of " << a << " and " << b << " is " << max(a, b) << endl;
    cout << "max of " << c << " and " << d << " is " << max(c, d) << endl;

    return 0;
}

运行结果:

max of 5 and 3 is 5
max of 7.5 and 4.2 is 7.5

类模板

类模板用于定义通用的类,它在类定义前面加上关键字 template,并在类名后面加上尖括号 < >,在尖括号中定义泛型参数。

template <typename T>
class Pair {
private:
    T first;
    T second;

public:
    Pair(T f, T s) : first(f), second(s) {}

    T getFirst() const { return first; }
    T getSecond() const { return second; }
};

int main() {
    Pair<int> p1(1, 2);
    Pair<double> p2(3.4, 5.6);

    cout << "Pair 1: " << p1.getFirst() << ", " << p1.getSecond() << endl;
    cout << "Pair 2: " << p2.getFirst() << ", " << p2.getSecond() << endl;

    return 0;
}

运行结果:

Pair 1: 1, 2
Pair 2: 3.4, 5.6

模板的特化

模板的特化是针对某一具体类型的模板进行特殊化定义。当某些类型需要特殊实现时,可以使用模板特化。

template <typename T>
class Array {
private:
    T* data;
    int size;

public:
    Array(int s) : size(s) {
        data = new T[size];
    }

    T& operator[](int index) {
        return data[index];
    }

    ~Array() {
        delete[] data;
    }
};

template <>
class Array<double> {
private:
    double* data;
    int size;

public:
    Array(int s) : size(s) {
        data = new double[size];
    }

    double& operator[](int index) {
        return data[index];
    }

    ~Array() {
        delete[] data;
    }
};

int main() {
    Array<int> arr1(5);
    Array<double> arr2(3);

    arr1[0] = 10;
    arr2[0] = 3.14;

    cout << "arr1[0]: " << arr1[0] << endl;
    cout << "arr2[0]: " << arr2[0] << endl;

    return 0;
}

运行结果:

arr1[0]: 10
arr2[0]: 3.14

模板的限制

在使用模板时,有一些限制需要注意:

  1. 模板不能隐式推断泛型参数的类型
  2. 静态成员变量不能用作非类型模板参数
  3. 不能在内部类中使用外部模板参数
  4. 不能使用 virtual 关键字声明为 virtual 的模板方法

STL中的模板

STL (Standard Template Library) 是C++标准库中提供的一组模板类和函数的集合,包括容器、算法和迭代器等。

容器

STL中提供了多种容器,如 vectorlistsetmap 等,它们都是模板类,可以存储不同类型的数据。

#include <vector>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5};

    for (auto i : v) {
        std::cout << i << " ";
    }

    return 0;
}

算法

STL中还提供了多种算法,如 sortfindaccumulate 等,它们都是模板函数,可以对容器中的元素进行操作。

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6};

    std::sort(v.begin(), v.end());

    for (auto i : v) {
        std::cout << i << " ";
    }

    return 0;
}

总结

泛型编程是C++中非常重要的一部分,可以通过模板实现通用的数据结构和算法,提高程序的重用性和扩展性。在学习和使用泛型编程时,需要注意模板的特化和限制,以及STL中提供的各种模板类和函数。通过灵活运用泛型编程,可以编写更加通用和高效的代码。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程