C++之获取数组长度

版权声明:本文为博主原创文章,转载请注明出处。

前言

在研究数组排序的过程中,发现了个很基础的问题–如何获取数组长度(成员数)。

似乎C++并没有提供获取数组长度的方法,网上搜索得知sizeof可以计算变量大小,可以通过获取数组大小/成员大小的办法得到数组长度。

当我将这个计算数组长度的方法封装起来时,发现事情并不简单。

1
2
3
4
5
6
7
int array_length(int ai[]) {
return sizeof ai / sizeof ai[0];
}

int is[] = {2, 4, 1, 3, 6, 5};
cout << sizeof is / sizeof is[0] << endl; // 输出: 6,right.
cout << array_length(is) << endl; // 输出: 2,emmmm???

引用类型

编译时说明了原因所在。

1
warning: sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Wsizeof-array-argument]

个人理解大概意思就是把数组传入函数,会变成引用类型(指针),即sizeof取得的是指针的size。

详情参考:点击查看

那就操蛋了,程序不封装好,每次想获取长度都tm要写一次sizeof的话,那就太傻逼了。

网上搜索了一下资料,似乎没有办法(不含复制)直接取出指针指向的数组。

模版类型

在做数组排序时,需要交换变量,搜索资料的时候发现了一种操作。

1
2
3
4
5
template <typename T>
T minn(T a,T b)
{
return (a<b)? a:b;
}

于是乎,尝试抄袭一下,正确获取到了数组长度。

1
2
3
4
template<typename T>
int array_length(T &at) {
return sizeof at / sizeof at[0];
}

原来只打算做int型数组排序的,结果,套用了这个template之后,全类型数值排序都实现了。

参考资料:点击查看

后话

如果想要简单获取length,也许该用vector

以下为本文实现的排序代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//
// Created by HsOjo on 2018/10/31.
//

#include <iostream>

using namespace std;

template<typename T>
void array_swap(T &at, int ia, int ib) {
int t = at[ia];
at[ia] = at[ib];
at[ib] = t;
}

template<typename T>
int array_length(T &at) {
return sizeof at / sizeof at[0];
}

template<typename T>
void array_sort(T &at, bool up) {
int c, l;
l = array_length(at);
do {
c = 0;
if (up) {
for (int i = 0; i < l - 1; i++) {
if (at[i] > at[i + 1]) {
array_swap(at, i, i + 1);
c++;
}
}
} else {
for (int i = l - 1; i > 0; i--) {
if (at[i] > at[i - 1]) {
array_swap(at, i, i - 1);
c++;
}
}
}
} while (c > 0);
}

int main() {
int is[] = {2, 4, 1, 3, 6, 5};
double ds[] = {2.5, 4.1, 1.2, 3.6, 6.123, 5.43, 4.32};

array_sort(is, true);
array_sort(ds, false);

for (int i: is) {
cout << i << ' ';
}
cout << endl;

for (double d: ds) {
cout << d << ' ';
}
cout << endl;

return 0;
}
# c++

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×