我收到了一个带有以下声明的标题:
//The index of 1 is used to make sure this is an array.
MyObject objs[1];
但是,我需要在程序启动时动态调整此数组的大小。我认为我应该将它声明为MyObject * objs;,但我认为如果原始程序员以这种方式声明它,那就有一些原因。
无论如何我可以动态调整大小吗?或者我应该将其更改为指针然后malloc()它?
我可以以某种方式使用某些新关键字吗?
答案 0 :(得分:16)
使用STL vector:
#include <vector>
std::vector<MyObject> objs(size);
向量是dynamic array,是Standard Template Library的一部分。它会自动调整大小,使push back个对象进入数组,并且可以像使用[]
operator的普通C数组一样进行访问。此外,&objs[0]
保证指向内存中的连续序列 - 与list不同 - 如果容器不为空。
答案 1 :(得分:6)
你是对的。如果要动态实例化其大小,则需要使用指针。
(因为您使用的是C ++,为什么不使用 new 运算符而不是 malloc ?)
MyObject* objs = new MyObject[size];
答案 2 :(得分:3)
或者我应该把它改成一个 指针然后malloc()呢?
如果你这样做,那么如何在malloc内存中为对象调用构造函数?我会给你一个提示 - 它们不会 - 你需要使用std :: vector。
答案 3 :(得分:1)
我只看到一个数组用作结构或联合内部的指针。这是很久以前的事情,用于将字符串的len和first char视为哈希,以提高脚本语言字符串比较的速度。
代码与此类似:
union small_string {
struct {
char len;
char buff[1];
};
short hash;
};
然后使用malloc初始化了small_string,注意c cast实际上是一个reinterpret_cast
small_string str = (small_string) malloc(len + 1);
strcpy(str.buff, val);
并测试平等
int fast_str_equal(small_string str1, small_string str2)
{
if (str1.hash == str2.hash)
return strcmp(str1.buff, str2.buff) == 0;
return 0;
}
正如您所看到的,这不是一种非常便携或安全的c ++风格。但是为短字符串索引的关联数组提供了极大的速度提升,这是大多数脚本语言的基础。
我今天可能会避免这种c ++风格。
答案 4 :(得分:1)
这是在某个结构的某个地方吗?
我见过的一个技巧是声明一个结构
struct foo {
/* optional stuff here */
int arr[1];
}
和malloc比sizeof (struct foo)
更多的内存,以便arr
成为可变大小的数组。
当我攻击C时,这在C程序中相当常用,因为可变大小的数组不可用,并且进行额外的分配被认为太容易出错。
在几乎所有情况下,正确的做法是将数组更改为STL向量。
答案 5 :(得分:0)
如果您想要一个动态调整大小的数组,最好使用STL,有几个选项,一个是std::vector。如果您不想插入,也可以使用std :: list。
答案 6 :(得分:0)
似乎 - 是的,你可以做这个改变 但请检查sizeof(objs)上的代码;
MyObj *arr1 = new MyObj[1];
MyObj arr2[1];
sizeof(arr1) != sizeof(arr2)
也许这个事实在代码中的某处使用过。
答案 7 :(得分:0)
这个评论非常糟糕。单元素数组是一个数组,即使注释另有说明。
我从未见过有人试图以这种方式强制执行“是阵列”。数组语法主要是语法糖(a[2]
给出与2[a]
相同的结果:即a
中的第三个元素(注意 this is an interesting and valid syntax but usually a very bad form to use,因为你会毫无理由地混淆程序员)。
因为数组语法主要是语法糖,所以切换到指针也是有意义的。但是,如果你要这样做,那么继续使用new[]
更有意义(因为你让你的构造函数被免费调用),而std::vector
更有意义(因为你没有必须记住,由于返回,中断,语句结束,抛出异常等原因,数组超出范围的每个地方都会调用delete[]
。