C++中的数组类型操作

简介: 本文演示了一些可用于查询和操作数组类型(甚至是多维数组)的内置函数。在我们需要信息或操作我们用不同维度启动的数组的情况下,这些函数非常有用。这些函数在头文件 中定义。一些功能包括:

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情


本文演示了一些可用于查询和操作数组类型(甚至是多维数组)的内置函数。在我们需要信息或操作我们用不同维度启动的数组的情况下,这些函数非常有用。这些函数在头文件 中定义。一些功能包括:


  1. is_array() : 顾名思义,此函数的唯一目的是检查变量是否为数组类型。这里值得注意的是,根据此函数,即使是 std::array 也不被视为数组。如果类型是数组,则“value”成员常量返回true,否则返回false。

  2. is_same(): 此函数用于检查类型关系,如果两个类型具有完全相同的特征,则返回 true。如果类型相同,则“value”成员常量返回 true,否则返回 false。
// 演示is_array()和is_same()工作的C++代码
#include<type_traits>
#include<iostream>
#include<array>
#include<string>
using namespace std;
int main()
{
  // 使用is_array检查哪个是数组
  cout << "Is Integer an array? : " << is_array<int>::value << endl;
  cout << "Is Array an array? : " << is_array<int[10]>::value << endl;
  cout << "Is 2D Array an array? : "
  << is_array<int[10][10]>::value << endl;
  cout << "Is String an array? : " << is_array<string>::value << endl;
  cout << "Is Character Array an array? : "
  << is_array<char[10]>::value << endl;
  cout << "Is Array class type an array? : "
  << is_array<array<int,3>>::value << endl;
  cout << endl;
  // 使用is_same()检查相同类型
  cout << "Is 2D array same as 1D array? : " <<
  is_same<int[10],int[10][10]>::value << endl;
  cout << "Is Character array same as Integer array? : "
  << is_same<int[10],char[10]>::value << endl;
  cout << "Is 1D array same as 1D array (Different sizes) ? : "
  << is_same<int[10],int[20]>::value << endl;
  cout << "Is 1D array same as 1D array? (Same sizes): "
  << is_same<int[10],int[10]>::value << endl;
  return 0;
}
复制代码

  1. 输出:
Is Integer an array? : 0
Is Array an array? : 1
Is 2D Array an array? : 1
Is String an array? : 0
Is Character Array an array? : 1
Is Array class type an array? : 0
Is 2D array same as 1D array? : 0
Is Character array same as Integer array? : 0
Is 1D array same as 1D array (Different sizes) ? : 0
Is 1D array same as 1D array? (Same sizes): 1
复制代码

  1. 等级() : 这是一个属性查询函数,它返回数组的秩。秩表示数组的维度。值成员常量返回对象的秩。

// 演示rank()工作的C++代码
#include<type_traits> // 用于数组查询函数
#include<iostream>
using namespace std;
int main()
{
  // 检查不同类型的等级
  cout << "The rank of integer is : " << rank<int>::value << endl;
  cout << "The rank of 1D integer array is : "
  << rank<int[10]>::value << endl;
  cout << "The rank of 2D integer array is : "
  << rank<int[20][10]>::value << endl;
  cout << "The rank of 3D integer array is : "
  << rank<int[20][10][40]>::value << endl;
  cout << "The rank of 1D character array is : "
  << rank<char[10]>::value << endl;
  cout << endl;
}
复制代码

输出:

The rank of integer is : 0
The rank of 1D integer array is : 1
The rank of 2D integer array is : 2
The rank of 3D integer array is : 3
The rank of 1D character array is : 1
复制代码

  1. extent(): 范围和移除范围都是复合类型更改,可应用于C++中的数组。此函数返
  2. 回数组特定维度的大小。此函数接受两个参数,数组类型和必须找到其大小的维度。这也具有打印值的成员常量值。

  3. remove_extent() : 此函数删除声明的矩阵/数组中左侧的第一个维度。

  4. remove_all_extents(): 此函数删除矩阵/数组的所有维度并将其转换为基本数据类型。


// C++代码演示extent()、remove_extentt()和remove_all_extents()的工作
#include<type_traits> // 用于数组查询函数
#include<iostream>
using namespace std;
int main()
{ 
  // 检查不同类型的范围(使用范围)
  cout << "The extent of 1st dimension of 3D integer array is : " ;
  cout << extent<int[20][10][40],0>::value << endl;
  cout << "The extent of 2nd dimension of 3D integer array is : " ;
  cout << extent<int[20][10][40],1>::value << endl;
  cout << "The extent of 3rd dimension of 3D integer array is : " ;
  cout << extent<int[20][10][40],2>::value << endl;
  cout << "The extent of 4th dimension of 3D integer array is : " ;
  cout << extent<int[20][10][40],3>::value << endl;
  cout << endl;
  // 正在删除类型的范围
  cout << "The rank after removing 1 extent is : " ;
  cout << rank<remove_extent<int[20][10][30]>::type>::value << endl;
  //删除左侧的第一个维度
  cout << "The extent of 1st after removing 1 extent is : " ;
  cout << extent<remove_extent<int[20][10][30]>::type>::value << endl;
  cout << endl;
  // 删除类型的所有范围
  cout << "The rank after removing all extents is : " ;
  cout << rank<remove_all_extents<int[20][10][30]>::type>::value << endl;
  // 删除所有范围
  cout << "The extent of 1st after removing all extents is : " ;
  cout << extent<remove_all_extents<int[20][10][30]>::type>::value << endl;
  cout << endl;
}
复制代码


输出:

The extent of 1st dimension of 3D integer array is  : 20
The extent of 2nd dimension of 3D integer array is  : 10
The extent of 3rd dimension of 3D integer array is  : 40
The extent of 4th dimension of 3D integer array is  : 0
The rank after removing 1 extent is : 2
The extent of 1st after removing 1 extent is : 10
The rank after removing all extents is : 0
The extent of 1st after removing all extents is : 0
复制代码


如果大家发现什么不正确的地方,或者你想分享有关上述数组类型操作的更多内容,可以在下面评论。



目录
相关文章
|
3月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
87 4
|
2月前
|
存储 编译器 程序员
C++类型参数化
【10月更文挑战第1天】在 C++ 中,模板是实现类型参数化的主要工具,用于编写能处理多种数据类型的代码。模板分为函数模板和类模板。函数模板以 `template` 关键字定义,允许使用任意类型参数 `T`,并在调用时自动推导具体类型。类模板则定义泛型类,如动态数组,可在实例化时指定具体类型。模板还支持特化,为特定类型提供定制实现。模板在编译时实例化,需放置在头文件中以确保编译器可见。
33 11
|
3月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
4月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
45 4
|
3月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
4月前
|
C++
使用 QML 类型系统注册 C++ 类型
使用 QML 类型系统注册 C++ 类型
62 0
|
4月前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
136 0
|
5月前
|
编译器 C++ 运维
开发与运维函数问题之函数的返回类型如何解决
开发与运维函数问题之函数的返回类型如何解决
38 6
|
5月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
33 6
|
5月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
56 5