在向量中获取特定元素

时间:2012-10-28 20:18:32

标签: c++ sdl game-engine stdvector

我正在尝试在向量中获取特定元素。 例如,

假设我有一个载体。

std::vector<Tile> TileList;

Vector的大小为MAP_HEIGHT = 30,MAP_WIDTH = 200 所以它的总大小是MAP_HEIGHT * MAP_WIDTH = 6000。 我使用双嵌套for循环来迭代并创建一个满是tile的向量。

for(int Y = 0; Y < MAP_HEIGHT; Y++)
{
   for(int X = 0; X < MAP_WIDTH; X++)
   {
        Tile TempTile;

        fscanf(FileHandle, "%d:%d ", &TempTile.TileID, &TempTile.TypeID);

        TileList.push_back(TempTile);

   }

}

现在我的问题可以说是我遍历

int ID = 0;

for(int Y = 0; Y < MAP_HEIGHT; Y++)
{
   for(int X = 0; X < MAP_WIDTH; X++)
   {
        TileList[ID].do stuff with it

        //Check for the tile above this tile
        // Find a way to calculate the ID of the tile above this tile
        int IDoftilabove = ID - do something;
        if(TileList[IDoftilabove].variable == TILE_SOMETHING)
        {
           do stuff
        }
       ID++;
    }

如何根据我当前的元素计算向量内部元素的ID(技术上在此ID之前)。

插图: 说我有一个矩阵5x5, 让我说我目前的ID是8.所以我在第二行3号。

1  2 *3* 4  5
1  2 (3) 4  5
1  2  3  4  5
1  2  3  4  5
1  2  3  4  5

现在我想要向量中直接位于我上面的元素的ID,即ID 3,第一行第3行。这只是假设MAP_WIDTH = 5且MAP_HEIGHT = 5。

3 个答案:

答案 0 :(得分:2)

8 - 5 = 3

当前 - MAP_WIDTH =高于

答案 1 :(得分:0)

您可以轻松确定(row,col)的<{1}}坐标:

ID

如果你想知道上面元素的坐标是什么:

row = ID / MAP_WIDTH;
col = ID % MAP_WIDTH;

如果你想知道下面的元素是什么,同样适用:

row--;
ID_above = row * MAP_WIDTH + col;

答案 2 :(得分:0)

您似乎想要在线性和二维索引之间进行映射。这非常简单。

   int rect2lin(int w, int x, int y) { return y*w+x; }
   void lin2rect(int w, int i, int * x, int * y) { *y = i/w; *x = i%w; }

因此在您的示例中,上面(X,Y)元素的ID将是rect2lin(MAP_WIDTH,X,Y-1),它只是(Y-1)* MAP_WIDTH + X.这直接推广到更高维数。例如,i =(z * h + y)* w + x表示3d,依此类推。