array
array
是C++标准库中的一个容器类模板,用于表示具有固定大小的数组。它提供了类似于C风格数组的功能,同时还提供了更多的操作和安全性。
使用array
模板需要包含头文件<array>
。
array
的特点包括:
- 固定大小:在创建
array
对象时,需要指定数组的大小,并且不能改变大小。 - 连续存储:
array
中的元素在内存中是连续存储的,可以通过索引访问。 - 安全性:
array
提供了边界检查,可以避免越界访问。 - 支持迭代器:可以使用迭代器遍历
array
中的元素。 - 支持STL算法:可以使用STL算法对
array
进行操作,如排序、查找等。
下面是使用array
的示例代码:
#include <array>
#include <iostream>
int main() {
std::array<int, 5> arr = {1, 2, 3, 4, 5};
// 访问元素
std::cout << "arr[0]: " << arr[0] << std::endl;
std::cout << "arr.at(2): " << arr.at(2) << std::endl;
// 修改元素
arr[3] = 10;
arr.at(4) = 20;
// 遍历元素
for (const auto& elem : arr) {
std::cout << elem << " ";
}
std::cout << std::endl;
return 0;
}
输出结果为:
arr[0]: 1
arr.at(2): 3
1 2 3 10 20
在上面的示例中,我们首先创建了一个大小为5的array
对象arr
,并初始化了它的元素。然后我们使用索引和at()
方法访问和修改元素。最后,我们使用范围for
循环遍历了array
中的元素。
需要注意的是,array
的大小必须在编译时确定,并且不能改变。如果需要动态大小的数组,可以使用vector
容器。
和数组区别
#include<iostream>
using namespace std;
//非类型模板参数 --常量 必须在编译器就能确认结果 (不能是浮点数、类对象、字符串)
template<class T ,size_t N = 10>
class array
{
private:
T _a[N];
};
int main()
{
array<int> a0;
array<int, 10> a1;
array<double, 100> a2;
int a[10];
a1[15]; //越界会被查出来,是函数调用
a[15]; //越界不一定会被查,因为是指针解引用 只会查到一定范围比如a[12]
return 0;
}
非类型模板参数的特化
非类型模板参数的特化是指为模板的非类型参数提供具体的值或类型。非类型模板参数可以是整数、浮点数、指针、引用、枚举、函数指针等。
在C++中,可以通过特化来为非类型模板参数提供具体的值或类型。特化分为完全特化和部分特化两种情况。
-
完全特化:
- 完全特化是指为模板的所有非类型参数提供具体的值或类型。
- 完全特化的语法如下:
template <typename T, int N> class MyClass {}; // 原始模板 template <> class MyClass<int, 10> {}; // 完全特化
- 在完全特化中,需要在模板名后加上一对空的尖括号<>,并提供具体的值或类型。
-
部分特化:
- 部分特化是指为模板的部分非类型参数提供具体的值或类型。
- 部分特化的语法如下:
template <typename T, int N> class MyClass {}; // 原始模板 template <typename T> class MyClass<T, 10> {}; // 部分特化
- 在部分特化中,需要在模板名后加上一对尖括号<>,并提供具体的值或类型,但其中的某些非类型参数可以保持为模板参数。
需要注意的是,非类型模板参数的特化只能在模板定义的作用域内进行,且特化的定义必须在使用之前。此外,对于非类型模板参数的特化,需要满足特化条件的匹配规则,否则会导致编译错误。
总结起来,非类型模板参数的特化是为模板的非类型参数提供具体的值或类型。可以通过完全特化或部分特化来实现。特化的定义必须在使用之前,并且需要满足特化条件的匹配规则。