论C++如何优雅的使用数组

简介: C/C++中如果一个函数接受一个数组作为参数,那么数组将会被退化为指针,如果定义如下代码: //数组arr的大小未知。 int arrsize(int arr*) { cout

C/C++中如果一个函数接受一个数组作为参数,那么数组将会被退化为指针,如果定义如下代码:

//数组arr的大小未知。
int arrsize(int arr*) {
  cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1 }
  • 1
  • 2
  • 3
  • 4

在上面那段代码中不仅得到的数组大小是不正确的,还会出现让调用则不明白是传递int变量的地址,还是传递一个指针(数组),为了解决第二个歧义现象,我们可以定义如下:

//数组arr的大小依旧未知。
int arrsize(int arr[]) {
  cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl; //1 }
  • 1
  • 2
  • 3
  • 4

即使我们按上面那种定义,但数组的的大小我们依旧不知道,但现在编译器还会提示类似如下警告:

 warning: ‘sizeof’ on array function parameter ‘arr’ will return size of ‘int*’ [-Wsizeof-array-argument]
  • 1

为了更好的解决上面的问题我们可以考虑使用一个引用形参,可以有如下代码:

//数组arr的大小必须是12,否则会报错。
int arrsize_const_size(int (&arr)[12]) {
  cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12 } 
  • 1
  • 2
  • 3
  • 4
  • 5

即使我们使用引用形参解决了,在函数内部我们无法正确获取数组大小的问题,但更复杂的问题出现了,我们只能接受固定数量的大小的数组,解决这个问题,我们可以通过一种很常规的手法定义函数如下:

 //指定一个数组大小n
int arrsize_n(int arr[], int n) {

}
  • 1
  • 2
  • 3
  • 4
  • 5

上面虽然解决了,但我们多传递了一个参数,调用代码看起来没有前两个更加简洁了,虽然问题被很好的解决了,为了更好的解决这个问题我们可以把推断数组大小的事交个编译器,使用非类型模板参数。

template<int n>
int arrsize_template_size(int (&arr)[n]) {
  cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12 cout << "n : " << n << endl;//12 for (int i = 0; i < n; i++) { cout << "arr[" << i << "] = " << arr[i] << endl; } return 0; } 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

下面给出完整的测试代码:

#include <iostream>

using namespace std;


//数组arr的大小未知。 int arrsize(int arr[]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//1 return 0; } //数组arr的大小必须是12,否则会报错。 int arrsize_const_size(int (&arr)[12]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12 return 0; } //指定一个数组大小n int arrsize_n(int arr[], int n) { return 0; } template<int n> int arrsize_template_size(int (&arr)[n]) { cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << endl;//12 cout << "n : " << n << endl;//12 for (int i = 0; i < n; i++) { cout << "arr[" << i << "] = " << arr[i] << endl; } return 0; } int main() { int arr[12] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, }; int arr1[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, }; arrsize(arr); arrsize_const_size(arr); cout << "-------------------------------------" << endl; arrsize_template_size(arr); cout << "-------------------------------------" << endl; arrsize_template_size(arr1); cout << "-------------------------------------" << endl; return 0; }

如果array类型也是复用的话,那么就有最终版本:

template<typename T,int n>
        void print_arr_in_tpl(T (&arr)[n]){
            std::cout << "element num : " << sizeof(arr) / sizeof(arr[0]) << std::endl;//
            for(int i=0;i<n;++i){
                std::cout<<arr[i]<<std::endl;
            }
        }

 

哈哈, 大家拿去用吧




谋胆并重
目录
相关文章
|
1月前
|
存储 算法 编译器
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
【C++ 字符数组的模板特化】面向字符串的C++模板特化:理解与实践
47 1
|
1月前
|
存储 缓存 安全
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
C++数组全解析:从基础知识到高级应用,领略数组的魅力与技巧
53 1
|
1月前
|
存储 算法 搜索推荐
在C++编程语言中数组的作用类型
在C++编程语言中数组的作用类型
14 0
在C++编程语言中数组的作用类型
|
1月前
|
C++
.C++中结构体数组docx
.C++中结构体数组docx
14 0
|
2月前
|
人工智能 移动开发 算法
【动态规划】【C++算法】LeetCoce996正方形数组的数目
【动态规划】【C++算法】LeetCoce996正方形数组的数目
|
2月前
|
算法 测试技术 C++
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
【动态规划】【滑动窗口】【C++算法】 629K 个逆序对数组
|
2月前
|
机器学习/深度学习 C++
C/C++基础知识——数组、循环
C/C++基础知识——数组、循环
42 0
C/C++基础知识——数组、循环
|
2天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
22 1
|
1月前
|
存储 缓存 安全
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
【C/C++ 基础 数组容器比较】深入探究C++容器:数组、vector与array之间的异同
15 0
|
1月前
|
存储 算法 C语言
C++系列十二:指针数组
C++系列十二:指针数组