数组的末尾指向新分配的数组C++

End of array points to newly allocated array C++

本文关键字:数组 分配 C++ 新分配      更新时间:2023-10-16

使用C++,我试图创建一个数组,该数组包含指向我正在存储的对象的指针。但是当数组已满时,我想扩展数组。

简单的选择是分配一个更大的新数组,然后将元素复制到其中,这是非常低效的,我想了另一种方法:

  1. 创建固定大小的X 阵列

  2. 满时,创建一个新数组,并使第一个数组的末尾指向第一个元素的开头

  3. 根据需要重复

我可以用什么方法做到这一点我想了一种方法,但似乎很难:

将我的所有新数组声明为指向对象指针的指针,然后将填充的元素重新封装到对象指针。

注意:我知道我可以使用Vector,但指示我不要使用std库


谨致问候,

评论中已经有了一些不错的答案。我只想提供一种方法来实现您所描述的行为。

由于数组的元素也是指针,因此可以将并集定义为数组的元素,如下所示:

template<typename T>
union Cell
{
    T* pElm;
    Cell* pNext;//A fixed size array of Cells
}

然后在上面构建你的阵列。例如:

template<typename T>
class SpecialArray
{
public:
    //the next pointer is included
    static const size_t ARRAY_LEN = 1000;// For example
    using Pointer = T*;
    using Segment = Cell<T>[ARRAY_LEN];
protected:
    Segment* pFirst;
    size_t mSize;
public:
    SpecialArray()
        :pFirst(nullptr),mSize(0){}
    SpecialArray(SpecialArray&&){}
    ~SpecialArray(){}
    Pointer& operator[](size_t index)
    {
        Segment* seg = pFirst;
        size_t offest = 0;
        //Search logic...
        return seg[offest]->pElm;
    }
    const Pointer& operator[](size_t index) const;
};

使用C++,我试图创建一个数组,其中包含指向我正在存储的对象。但是当数组已满时,我想扩展大堆

使用C++模板和C基元,我们可以即兴制作一个简单的向量,如下所示。增长缓冲策略是在达到阈值时将大小增加一倍。

#include <iostream>
#include <stdlib.h>
template <typename T>
class MyVector
{
   public:
      MyVector() : m_count(0), m_size(0), m_buffer(0)
      {
          m_size = bufInitSize;
          m_buffer = (T*)malloc(sizeof(T) * bufInitSize);
      }
      ~MyVector()
      {
         if (m_buffer)
            free(m_buffer);
      }
      void add(const T& p)
      {
         if (m_count + 1 >= m_size)
         {
             m_size *= 2;
             m_buffer = (T*)realloc(m_buffer, sizeof(T) * m_size);
         }
         m_buffer[m_count ++ ] = p;
      }
      T& operator[](int idx)
      {
         return m_buffer[idx];
      }
   private:
      static const int bufInitSize = 1024;
      T*  m_buffer;
      int m_count;
      int m_size;
};
void main()
{
   // using MyVector
   MyVector<int*> vctOfIntPtr;
   int n = 100;
   vctOfIntPtr.add(&n);
   int* pN = vctOfIntPtr[0];
   std::cout << *pN;
}