C++ 在C+中填充数组+;不转换索引
以下是我所拥有的:C++ 在C+中填充数组+;不转换索引,c++,arrays,pointers,syntax,padding,C++,Arrays,Pointers,Syntax,Padding,以下是我所拥有的: int t[MX]; 现在,我想重写该代码,以便有效地将单个元素添加到该数组的开头,而不必在其余代码中将所有索引转换为1。该问题的解决方案可能如下: int _t[MX+1]; int * const t = _t+1; #define MX 1000 typedef int arr_mx[MX]; int _t[MX+1]; arr_mx &t = *((arr_mx*)(&_t[1])); 这种方法的问题是,现在这样的方法不再有效: memset
int t[MX];
现在,我想重写该代码,以便有效地将单个元素添加到该数组的开头,而不必在其余代码中将所有索引转换为1。该问题的解决方案可能如下:
int _t[MX+1];
int * const t = _t+1;
#define MX 1000
typedef int arr_mx[MX];
int _t[MX+1];
arr_mx &t = *((arr_mx*)(&_t[1]));
这种方法的问题是,现在这样的方法不再有效:
memset(t, 0, sizeof t);
问题是sizeof t
返回4,而不是我希望的MX*4
一种可能的解决办法可能是:
struct
{
int a;
int b[MX];
} _t;
int (&t)[MX] = _t.b;
但我觉得这很不雅观,也不令人满意。
因此,我的问题是:
有更好的方法吗?第二种解决方案不仅“不雅且不令人满意”,而且是未定义的行为。有关此主题的更多信息,请参见的答案 第一种解决方案允许您使用负索引,因为
ptr[index]
相当于*(ptr+index)
,因此只要结果指向数组内,就可以了
sizeof
问题的解决方案可以通过以下方法构建:制作一个封装数组的模板类,并在其下标操作符内进行索引转换
如果这不起作用,您可以返回到原始两个解决方案的组合,但没有未定义的行为,例如:
int _t[MX+1];
int * const t = _t+1;
#define MX 1000
typedef int arr_mx[MX];
int _t[MX+1];
arr_mx &t = *((arr_mx*)(&_t[1]));
这是一个。为什么要在
std::vector上使用它呢?
?除了那一小部分代码之外,我不想重写任何东西。我希望代码尽可能简单,而不是像那样引入一些繁重的类。不管怎样,我真的不知道这有什么帮助。然后你应该把它标记为“C”——这里没有多少C++。顺便说一下,<代码> STD::vector < /Cuff> Hug?@ USE2081465学习标准C++库的容器。@ ZDavaVojjkoic <代码> int(&t)[Mx]=τ.b;<代码>我相信在C语言中是不可能的,因为这是一个引用。我希望解决方案尽可能简单、简短和高效,这就是我不想使用stl的原因。谢谢你的回答。我还必须实现一个到int*
的转换操作符,使其与现有代码完全兼容。通过这种方式,它可以在memset
中正常工作,只需将所有值设置为任意值,包括带有“index”-1的值。问题是,到int*
的转换必须返回指向元素-1的指针,否则memset
将尝试设置最后一个元素之后的第一个元素的值,因为sizeof
运算符不能重载,必须返回整个对象的大小。现在,期望得到指向数组元素0的指针的函数将得到-1。@toi333运算符int*
应该返回未翻译的地址。只有运算符int&[]
应该返回翻译后的值。这样,您的memset
就能够用零填充缓冲区,而不会超过缓冲区的末尾。需要转换指针的函数应该使用&t[0]
而不是(int*)t
来获取转换地址。我就是这样实现的。不幸的是,正如您最后所建议的,我不能这样做,因为这需要重写代码的其他部分t
本身应该可以隐式地强制转换为int*
元素0(实际数组中的索引1)。非常好,这是完美的!谢谢!