在C ++中将列表转换为二维对象数组

时间:2015-02-12 22:11:31

标签: c++ arrays pointers

我有一个这样的清单:

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

但是这给了我一个错误:没有可行的重载=;

另一点:我需要与列表具有相同的指针,而不是这些项目的副本。

3 个答案:

答案 0 :(得分:2)

bBox*,但由于boxesBox**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 + 1b->y + 1超出当前向量的容量时才有效。

答案 2 :(得分:0)

我假设xyBox位于给定坐标空间内的坐标。如果是这种情况,它们实际上不适合数组/向量索引。您必须分配数组/向量来考虑所有可能的坐标,即使是那些不包含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