C++:使用迭代器构造一个二维动态分配的数组

Posted

技术标签:

【中文标题】C++:使用迭代器构造一个二维动态分配的数组【英文标题】:C++: using iterator to construct a 2D dynamically allocated array 【发布时间】:2020-06-03 16:18:59 【问题描述】:

我是 C++ 新手,我正在尝试创建一个具有动态分配二维数组的构造函数的类。我尝试将 for 循环与迭代器一起使用(例如:for(auto itr = arr.begin(); itr! = arr.end(); itr++))并发现我不能将 .begin() 与指针一起使用。

以下是我的代码:

class Myarray 
public:
    Myarray(std::size_t a, std::size_t b) : row(a), col(b) 
        ptr = new int* [row];
        for (auto itr = ptr->begin(); itr != (*ptr).end(); itr++) 
        itr = new int[col];
        
    
    //Myarray(Myarray& arr) ; copy constructor, not filled yet
    //~Myarray() ; destructor, not filled yet

private:
    std::size_t row, col;
    int** ptr;

;

我不确定为什么 (*ptr).end() 和 ptr->begin() 都不起作用。我的猜测是: ptr 应该指向数组的第一个条目,所以我不能使用 .end() 和 begin() 。

(1) 我对此是否正确? (2) 有没有什么方法可以用迭代器动态分配数组?

感谢您的回答!

【问题讨论】:

ptr 是一个原始指针,它不是一个类实例,因此它没有任何成员函数,例如beginend。您可以从ptr 迭代到ptr + row(独家)。实际上,指针是(随机访问)迭代器。 【参考方案1】:

我正在尝试创建一个具有动态分配二维数组的构造函数的类

关于动态 2D 数组的一点是,只有它们的最外层维度可以是动态的。看来您需要两个动态维度。这对于 C++ 中的二维数组是不可能的。

看起来你不是在创建一个二维数组,而是一个指针数组,其中每个指针都指向一个整数数组,所以上面提到的限制不是问题。

我不确定为什么 (*ptr).end() 和 ptr->begin() 都不起作用。

. 是成员访问运算符。 ptr 指向一个指针。指针没有成员。

我的猜测是:ptr 应该指向数组的第一个条目,所以我不能使用 .end() 和 begin() 。

(1) 我说的对吗?

是的ptr 指向的指针是动态指针数组的第一个元素。

(2) 有没有什么方法可以用迭代器动态分配数组?

我不太明白这句话,但那可能是因为你还不太明白这些词的意思。

指针是数组的迭代器。因此,鉴于ptr 是指向数组第一个元素的指针,并且您希望迭代器指向第一个元素,那么ptr 就是您想要的迭代器。

您还需要结束迭代器。你可以用指针算术得到它。只需将数组的长度添加到开头即可到达结尾:ptr + row


附:不要使用拥有裸指针。使用std::vector等RAII容器创建动态数组。

【讨论】:

以上是关于C++:使用迭代器构造一个二维动态分配的数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C++ 中的指针动态分配和解除分配二维数组?

在 C++ 中初始化动态二维数组

二维数组C++的动态分配

c++ 动态分配二维数组 new 二维数组

在 C++ 中使用动态内存分配创建二维数组

指向 C++ 中动态分配的二维数组中的一行的指针