好吧,我试图从现有阵列中获取一个子数组,我只是不知道该怎么做.在我的例子中,我有一个非常大的数组,但我想从数组的最后5个元素创建一个数组.
我所谈论的一个例子是:
int array1 = {1,2,3,...99,100};
int array2[5] = array1+95;
Run Code Online (Sandbox Code Playgroud)
我知道这是不正确的,但我在纠正它时遇到了一些麻烦.我想在array1中获取元素96到100并将它们放入array2但我不想复制数组.我只想让array2从96元素开始,这样array1 [96]和array2 [0]将指向同一个位置.
jsp*_*cal 17
为了这:
"such that array1[96] and array2[0] would be pointing to the same location."
Run Code Online (Sandbox Code Playgroud)
你可以做:
int *arr2 = arr1 + 96;
assert(arr2[0] == arr1[96] == 97);
Run Code Online (Sandbox Code Playgroud)
来自C程序员的参考黑客,他们愿意颠覆类型系统以获得有效的方法:
int (&array2)[5] = (int (&)[5])(*(array1 + 5));
Run Code Online (Sandbox Code Playgroud)
现在array2将是一个用于所有意图和目的的数组,并且将成为一个子数组array1,甚至可以通过那个着名的C++ array_size模板函数.虽然处理这个hackery的最好方法是隐藏它更多的hackery!
#define make_sub_array(type, arr, off, len) (type (&)[len])(*(arr + off));
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Run Code Online (Sandbox Code Playgroud)
尼斯.一些标准可怕,但最终结果a)看起来非常整洁,b)完全符合你的要求,c)在功能上与实际数组完全相同,并且d)还将具有额外的奖励(或错误特征)与原件相同的参考,所以两者一起改变.
更新:如果您愿意,可以使用模板化版本(有点):
template <typename T, size_t M>
T (&_make_sub_array(T (&orig)[M], size_t o))[]
{
return (T (&)[])(*(orig + o));
}
#define make_sub_array(type, array, n, o) (type (&)[n])_make_sub_array(array, o)
int (&array2)[5] = make_sub_array(int, array1, 5, 5);
Run Code Online (Sandbox Code Playgroud)
我们仍然必须通过这种类型.由于我们的一个参数必须用作演员的一部分,我们不能干净地(恕我直言)避免宏.我们可以这样做:
template <typename T, size_t M, size_t N>
T (&make_sub_array(T (&orig)[M], size_t o))[N]
{
return (T (&)[N])(*(orig + o));
}
int (&array2)[5] = make_sub_array<int, 15, 5>(array1, 5);
Run Code Online (Sandbox Code Playgroud)
但这里的目标是使调用代码尽可能干净,并且调用有点毛茸茸.纯宏版本可能具有最小的开销,在这种情况下可能是最干净的.