我该如何更改此声明?

时间:2009-04-07 21:59:07

标签: c++ arrays resize

我收到了一个带有以下声明的标题:

//The index of 1 is used to make sure this is an array.
MyObject objs[1];

但是,我需要在程序启动时动态调整此数组的大小。我认为我应该将它声明为MyObject * objs;,但我认为如果原始程序员以这种方式声明它,那就有一些原因。

无论如何我可以动态调整大小吗?或者我应该将其更改为指针然后malloc()它?

我可以以某种方式使用某些新关键字吗?

8 个答案:

答案 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[]