【问题标题】:How do I dynamically assign the size to an array in C++?如何动态地将大小分配给 C++ 中的数组?
【发布时间】:2012-07-18 07:04:10
【问题描述】:

所以现在我在 C++ 中有一个名为 Set 的类。在其中,我有一个名为 mCardinality 的整数和一个名为 mElements 的整数数组。我希望能够在 mCardinality 的构造函数中接受一个整数,然后使用它来为我的整数数组分配一个大小,有没有办法做到这一点,或者我绝对必须马上为它设置一个大小? (我想我可以将大小设为最大整数,然后只使用基数来限制我处理元素的循环,但更简洁的解决方案会更好)。

我确实在这里看到了可能有一种方法可以使用 std::vector 来调整数组的大小,这可行吗?而且...该代码看起来如何?对于我想用它做的所有其他事情,向量是否像 C++ 中的数组一样工作?

【问题讨论】:

    标签: c++ arrays dynamic size cardinality


    【解决方案1】:

    您的选择如下:

    1. 使用 std::vector 或
    2. 使用普通的旧数组

    带矢量(推荐):

    class YourSet {
    public:
       YourSet(int size) : elements(size)
       {
       }
    private:
       std::vector<int> elements;
    };
    

    使用数组(由于可能存在异常安全问题,不推荐):

    class YourSet {
    public:
       YourSet(int size)
       {
           elements = new int[size];
       }
       ~YourSet()
       {
            delete[] elements;
       }
    private:
       int* elements;
       // no implementation to prevent shallow copying
       YourSet( const YourSet&);
       void operator=(const YourSet&);
    };
    

    【讨论】:

    • 我宁愿只使用数组。我该怎么做?
    • @Taylor Matyasz:我包括在内,但实际上vector 更好。
    【解决方案2】:

    std::vector 将适用于您的目的。

    #include <vector>
    
    class Set
    {
      Set(int len)
       : mElements(len)
      {
      }
    
      void do_smth()
      {
        size_t vector_len = mElements.size();
    
        int index = 0;
        int element = mElements[index];
      }
    
    
      std::vector<int> mElements;
    };
    

    【讨论】:

      【解决方案3】:

      Vector 保存指针,并在需要时重新分配内存。

      T* new_ptr = new T[new_size];
      std::copy(ptr, ptr + size, new_ptr);
      delete[] ptr;
      ptr = new_ptr;
      size = new_size;
      

      这是一个简单的例子。 Vector使用分配器,但实际上是这样的。

      【讨论】:

        【解决方案4】:

        转到向量。当您向其中添加或删除项目时,它会自动调整大小,如果需要,您也可以指定它的大小。

         vector<myClass> m_vClasses;
         myClass myNewObject;
         m_Classes.push_back(myNewObject); // Vector resized when you add new element
        

        假设您的 myClass 析构函数正确释放了类分配的任何内存,您无需担心内存或其他问题(除非 myClass 是指向动态分配内存的指针)。矢量会自动为您处理大小调整。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-11-15
          • 1970-01-01
          • 1970-01-01
          • 2011-01-03
          • 2012-09-15
          • 2017-12-13
          • 2020-11-26
          相关资源
          最近更新 更多