前言
在研究数组排序的过程中,发现了个很基础的问题--如何获取数组长度(成员数)。
似乎C++并没有提供获取数组长度的方法,网上搜索得知sizeof可以计算变量大小,可以通过获取数组大小/成员大小的办法得到数组长度。
当我将这个计算数组长度的方法封装起来时,发现事情并不简单。
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???
引用类型
编译时说明了原因所在。
warning: sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Wsizeof-array-argument]
个人理解大概意思就是把数组传入函数,会变成引用类型(指针),即sizeof取得的是指针的size。
详情参考:点击查看
那就操蛋了,程序不封装好,每次想获取长度都tm要写一次sizeof的话,那就太傻逼了。
网上搜索了一下资料,似乎没有办法(不含复制)直接取出指针指向的数组。
模版类型
在做数组排序时,需要交换变量,搜索资料的时候发现了一种操作。
template <typename T>
T minn(T a,T b)
{
return (a<b)? a:b;
}
于是乎,尝试抄袭一下,正确获取到了数组长度。
template<typename T>
int array_length(T &at) {
return sizeof at / sizeof at[0];
}
原来只打算做int型数组排序的,结果,套用了这个template之后,全类型数值排序都实现了。
参考资料:点击查看
后话
如果想要简单获取length,也许该用vector。
以下为本文实现的排序代码。
//
// 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;
}