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
是一个原始指针,它不是一个类实例,因此它没有任何成员函数,例如begin
或end
。您可以从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++:使用迭代器构造一个二维动态分配的数组的主要内容,如果未能解决你的问题,请参考以下文章