C++ 将列表转换为C+中的二维对象数组+;
我有这样一份清单:C++ 将列表转换为C+中的二维对象数组+;,c++,arrays,pointers,C++,Arrays,Pointers,我有这样一份清单: list<Box*> list; 我需要将其转换为二维数组(或向量向量),其中: 我还需要在这个数组中包含空或null对象,即:位置4,6没有任何内容(或空对象) 我的想法是: Box** boxes = new Box*[rows]; for(int r=0;r<rows;r++) boxes[r] = new Box[columns]; for(Box *b : list){ boxes[b->
list<Box*> list;
我需要将其转换为二维数组(或向量向量),其中:
我还需要在这个数组中包含空或null对象,即:位置4,6没有任何内容(或空对象)
我的想法是:
Box** boxes = new Box*[rows];
for(int r=0;r<rows;r++)
boxes[r] = new Box[columns];
for(Box *b : list){
boxes[b->x][b->y] = b;
}
Box**Box=新框*[行];
对于(int r=0;rx][b->y]=b;
}
但这给了我一个错误:没有可行的重载=
另一点:我需要与列表具有相同的指针,而不是这些项目的副本。
b
是一个Box*
,但因为Box
是一个Box**
,Box[b->x][b-y]
只是一个框
。因此类型不匹配-您试图将框*
分配给框
,因此出现错误
如果要使框
成为框*
的二维数组,只需另一个*
:
Box*** boxes = new Box**[rows];
for(int r=0;r<rows;r++) {
boxes[r] = new Box*[columns];
}
我假设
x
和y
是框
位于给定坐标空间内的坐标。如果是这种情况,它们并不真正适用于数组/向量索引。您必须分配数组/向量以考虑所有可能的坐标,即使是不包含框的坐标因此,我建议使用std::map
,例如:
std::list<Box*> BoxList;
std::map<int, std::map<int, Box*> > BoxMap;
...
for (std::list<Box*>::iterator iter = BoxList.begin(); iter != BoxList.end(); ++iter)
{
Box *box = *iter;
BoxMap[box->getX()][box->getY()] = box;
}
以下是使用向量向量的解决方案:
#include <vector>
#include <list>
struct Box
{
int x;
int y;
};
typedef std::vector<Box*> BoxVector;
typedef std::vector<BoxVector> BoxVector2D;
int main()
{
std::list<Box*> lBoxes;
BoxVector2D boxes;
// fill lBoxes as needed...
for(Box *b : lBoxes)
{
boxes.resize(b->x+1);
boxes[b->x].resize(b->y + 1);
boxes[b->x][b->y] = b;
}
// use boxes as needed...
}
#包括
#包括
结构盒
{
int x;
int-y;
};
typedef std::vector BoxVector;
typedef std::vector BoxVector2D;
int main()
{
std::列出lbox;
盒向量2D盒;
//根据需要填写邮箱。。。
用于(方框*b:lBoxes)
{
框。调整大小(b->x+1);
框[b->x]。调整大小(b->y+1);
框[b->x][b->y]=b;
}
//根据需要使用方框。。。
}
现在,正如其他评论所建议的,我假设坐标空间是合理的。请注意,我们调整每个项目的向量大小,确保我们不会越界
至于resize
,vector::resize
如果容量大于resize量,则基本上不起作用。因此resize
仅当b->x+1
或b->y+1
超过当前向量的容量时才起作用。或首选向量向量的向量x和y是索引,而不是坐标。如果是坐标,想想在一个大的坐标空间中有几个框时会发生什么。这是浪费了很多数组索引。我可能会使用std::map
。@RemyLebeau这是假设很多上下文不存在于问题中。我只是在解决类型问题。好吧,混蛋有很多东西你都搞定了!谢谢!
for (Box *b : list){
boxes[b->x][b->y] = b;
}
std::list<Box*> BoxList;
std::map<int, std::map<int, Box*> > BoxMap;
...
for (std::list<Box*>::iterator iter = BoxList.begin(); iter != BoxList.end(); ++iter)
{
Box *box = *iter;
BoxMap[box->getX()][box->getY()] = box;
}
Box *box = BoxMap[x][y];
if (box) ...
#include <vector>
#include <list>
struct Box
{
int x;
int y;
};
typedef std::vector<Box*> BoxVector;
typedef std::vector<BoxVector> BoxVector2D;
int main()
{
std::list<Box*> lBoxes;
BoxVector2D boxes;
// fill lBoxes as needed...
for(Box *b : lBoxes)
{
boxes.resize(b->x+1);
boxes[b->x].resize(b->y + 1);
boxes[b->x][b->y] = b;
}
// use boxes as needed...
}