【问题标题】:How should I change this declaration?我应该如何更改此声明?
【发布时间】:2010-10-18 04:26:34
【问题描述】:

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

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

但是,我需要使这个数组在程序启动时动态调整大小。我认为我应该将它声明为 MyObject *objs;,但我认为如果原来的程序员这样声明,那是有原因的。

无论如何我可以动态调整它的大小吗?还是我应该把它改成一个指针然后 malloc() 呢?

我可以使用一些新的关键字来做到这一点吗?

【问题讨论】:

    标签: c++ arrays resize


    【解决方案1】:

    使用STL vector

    #include <vector>
    
    std::vector<MyObject> objs(size);
    

    向量是dynamic array 并且是Standard Template Library 的一部分。当您将push back 对象放入数组时,它会自动调整大小,并且可以像使用[] operator 的普通C 数组一样访问。此外,&amp;objs[0] 保证指向内存中的连续序列 - 与 list 不同 - 如果容器不为空。

    【讨论】:

    • "&objs[0] 保证指向内存中的连续序列" 但请注意:只有在您确定向量不为空时才可以(例如使用 empty() 方法) .否则可能会导致未定义的行为。
    • 如果你事先知道大小,那么 Vector::reserve() 会很有帮助。
    【解决方案2】:

    你是对的。如果要动态实例化其大小,则需要使用指针。

    (既然您使用的是 C++,为什么不使用 new 运算符而不是 malloc?)

    MyObject* objs = new MyObject[size];
    

    【讨论】:

    • 哦,我认为你是对的。我已经习惯了 C#,它污染了我的 C++ :)
    【解决方案3】:

    或者我应该把它改成 指针然后 malloc() 呢?

    如果这样做,将如何为 malloc 内存中的对象调用构造函数?我会给你一个提示 - 他们不会 - 你需要使用 std::vector。

    【讨论】:

      【解决方案4】:

      我只看到一个数组在结构或联合中用作指针。这是很久以前的事了,用于将字符串的 len 和第一个 char 视为哈希,以提高脚本语言的字符串比较速度。

      代码是这样的:

      union small_string {
         struct {
            char len;
            char buff[1];
         };
         short hash;
      };
      

      然后使用 malloc 初始化 small_string,注意 c 转换实际上是 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++。

      【讨论】:

        【解决方案5】:

        这是在某个结构的末尾吗?

        我见过的一个技巧是声明一个结构

        struct foo {
        /* optional stuff here */
        int arr[1];
        }
        

        并且 malloc 比 sizeof (struct foo) 更多的内存,因此 arr 成为一个可变大小的数组。

        当我破解 C 时,这在 C 程序中相当常用,因为可变大小的数组不可用,而且进行额外的分配被认为太容易出错。

        在几乎所有情况下,正确的做法是将数组更改为 STL 向量。

        【讨论】:

          【解决方案6】:

          如果您想要一个动态调整大小的数组,最好使用 STL,有多种选择,一种是std::vector。如果你不介意插入,你也可以使用 std::list。

          【讨论】:

          • 这并不能解决他的问题。如果他可以将其更改为指针,那么他有很多选择来调整它的大小。 realloc 不会让他在使用当前声明时调整数组大小。
          【解决方案7】:

          看起来 - 是的,您可以进行此更改。
          但是在 sizeof( objs ); 上检查你的代码;

          MyObj *arr1 = new MyObj[1];
          MyObj arr2[1];
          
          sizeof(arr1) != sizeof(arr2)
          

          也许这个事实在你的代码中使用过。

          【讨论】:

            【解决方案8】:

            这个评论非常糟糕。即使注释另有说明,单元素数组也是数组。

            我从未见过有人试图以这种方式强制执行“是一个数组”。数组语法在很大程度上是语法糖(a[2] 给出与2[a] 相同的结果:即a 中的第三个元素(注意 this is an interesting and valid syntax but usually a very bad form to use,因为你会让程序员混淆没有理由))。

            因为数组语法在很大程度上是语法糖,所以切换到指针也很有意义。但是如果你要这样做,那么使用new[] 更有意义(因为你可以免费调用你的构造函数),使用std::vector 更有意义(因为你不必记住调用 delete[] 数组由于返回、中断、语句结束、抛出异常等而超出范围的每个位置。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2023-04-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多