c++ - 如何在 C++ 中动态分配连续的二维数组?

标签 c++ arrays

我需要一个二维字符数组用于绝对需要使用数组而不是 vector 的垃圾 API(非常强调这一点,因为我所有的搜索都只有“使用 vector ”的答案。我希望我可以)。

我认为这样做的方法是分配一个大小为行数 * 字符长度的外部数组,而不是:

char** arr;
arr = new char*[100];
// for loop that allocates the internal arrays

但我不确定需要使用什么方法才能使其连续?我是否需要先分配一个巨大的一维数组,然后将一维数组分块分配给二维数组?

最佳答案

正如其他答案所说:分配 n * m条目来创建连续的数据,然后可以将其包装在指针中以创建二维数组。

... absolutely requires use of arrays and NOT vectors ...

我不确定 vector是基于所使用的 API 或要求的约束——但值得注意的是 vector 可以用于实现的内存管理——同时仍然使用原始数据(可以通过 &vec[0]vec.data() 访问,它返回一个指针到数组的第一个元素,并且可以与接受原始指针的函数一起使用)。

因为这个问题是关于 C++ 的,一个选择是包装一个 n * m 的数组。在class 表现就像一个二维数组,但实际上是连续的。

一个简单的例子可以是:

class array_2d
{
public:

   array_2d( std::size_t rows, std::size_t columns )
     : m_rows(rows), m_cols(columns), m_array( new char[rows * columns] )
   {
   }

   ~array_2d()
   {
       delete [] m_array;
   }

   // row-major vs column-major is up to your implementation
   T& operator()( std::ptrdiff_t row, std::ptrdiff_t col )
   {
      // optional: do bounds checking, throw std::out_of_range first

      return m_array[row * m_cols + col];
      // alternatively:
      // return m_array[col * m_rows + row];
   }

   // get pointer to the array (for raw calls)
   char* data()
   {
     return m_array;
   }

private:

   char* m_array; 
   std::size_t m_rows;
   std::size_t m_cols;
};

(理想情况下 char* 将是 std::unique_ptr<char[]>std::vector<char> 以避免内存泄漏情况,但既然你说 vector 不可行,我将最低限度地写这个)

这个例子重载了调用运算符(operator())——但这也可以是一个像at(...)这样的命名函数;选择将取决于你。这种类型的使用将是:

auto array = array_2d(5,5); // create 5x5 array
auto& i01 = array(0,1); // access row 0, column 1

可选,如果 [][]语法对于表现得像二维数组(而不是 (r,c) 语法)很重要,您可以从对重载 operator [] 的调用返回代理类型(未经测试):

class array_2d_proxy
{
public:
   array_2d_proxy( char* p ) : m_entry(p){}

   char& operator[]( std::ptrdiff_t col ){ return m_entry[col]; }

private:

   char* m_entry;
};

class array_2d
{
  ...
  array_2d_proxy operator[]( std::ptrdiff_t row )
  {
    return array_2d_proxy( m_array + (row * m_cols) );
  }
  ...
};

这将允许您拥有“正常”的二维数组语法,同时仍然是连续的:

auto& i00 = array[0][0];

关于c++ - 如何在 C++ 中动态分配连续的二维数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46354262/

相关文章:

javascript - Node.js 数组实例化

c++ - 如何在 C++ 中从 "pointer-to-objects"的 vector 访问对象

c++ - dopen() : "failed to map segment from shared object" when not running as root

c++ win32 使用 DirectInput 模拟按键

php - 通过 php 数组将多行插入 mysql

arrays - 将值添加到存储为字节数组的整数

python - 输出为数组或方括号时的区别

c++ - 为什么 OpenCL 内核不对 Image2D 使用正常的 x y 坐标?

c++ - 编译错误

javascript - ES6 将一个数组的元素归约成一个数组,其元素出现的频率