c++学习(非类型模板参数)[12]

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++中,可以通过特化来为非类型模板参数提供具体的值或类型。特化分为完全特化和部分特化两种情况。

  1. 完全特化:

    • 完全特化是指为模板的所有非类型参数提供具体的值或类型。
    • 完全特化的语法如下:
      template <typename T, int N>
      class MyClass {};  // 原始模板
      
      template <>
      class MyClass<int, 10> {};  // 完全特化
      
    • 在完全特化中,需要在模板名后加上一对空的尖括号<>,并提供具体的值或类型。
  2. 部分特化:

    • 部分特化是指为模板的部分非类型参数提供具体的值或类型。
    • 部分特化的语法如下:
      template <typename T, int N>
      class MyClass {};  // 原始模板
      
      template <typename T>
      class MyClass<T, 10> {};  // 部分特化
      
    • 在部分特化中,需要在模板名后加上一对尖括号<>,并提供具体的值或类型,但其中的某些非类型参数可以保持为模板参数。

需要注意的是,非类型模板参数的特化只能在模板定义的作用域内进行,且特化的定义必须在使用之前。此外,对于非类型模板参数的特化,需要满足特化条件的匹配规则,否则会导致编译错误。

总结起来,非类型模板参数的特化是为模板的非类型参数提供具体的值或类型。可以通过完全特化或部分特化来实现。特化的定义必须在使用之前,并且需要满足特化条件的匹配规则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值