Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将列表转换为C+中的二维对象数组+;_C++_Arrays_Pointers - Fatal编程技术网

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...
}