我有一个这样的清单:
list<Box*> list;
其中Box是一个包含x和y值的对象。
box->getX();
box->getY();
我需要做的是将其转换为二维数组(或向量矢量),其中:
array[x][y] == box;
我还需要将空或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;
}
但是这给了我一个错误:没有可行的重载=;
另一点:我需要与列表具有相同的指针,而不是这些项目的副本。
答案 0 :(得分:2)
b
是Box*
,但由于boxes
是Box**
,boxes[b->x][b-y]
只是Box
。因此,您的类型不匹配 - 您正在尝试将Box*
分配给Box
,因此会出错。
如果您想让boxes
成为Box*
的二维数组,则只需要另一个*
:
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;
}
答案 1 :(得分:1)
这是使用矢量矢量的解决方案:
#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...
}
现在,正如其他评论所暗示的那样,我假设坐标空间合理。请注意,我们resize
每个项目的向量,确保我们不会超出范围。
至于resize
- 如果容量大于调整大小,则vector::resize
基本上是无操作。因此resize
仅在b->x + 1
或b->y + 1
超出当前向量的容量时才有效。
答案 2 :(得分:0)
我假设x
和y
是Box
位于给定坐标空间内的坐标。如果是这种情况,它们实际上不适合数组/向量索引。您必须分配数组/向量来考虑所有可能的坐标,即使是那些不包含Box
的坐标。因此,我建议改为使用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;
}
您仍然可以获得所需array[x][y]
语法的好处,但是您使用的内存要少得多(与您拥有的Box
个对象的实际数量成比例),并且如果您尝试访问{ {1}}在没有Box
的给定x / y坐标处,您将返回一个可以测试的NULL指针:
Box