Получение определенных элементов в векторе

Я пытаюсь получить определенный элемент внутри вектора.
Например,

Допустим, у меня есть вектор.

std::vector<Tile> TileList;

Вектор имеет размер MAP_HEIGHT = 30, MAP_WIDTH = 200
Таким образом, его общий размер MAP_HEIGHT * MAP_WIDTH = 6000.
Я использую двойной вложенный цикл for, чтобы перебрать и создать вектор, полный плиток.

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

Как рассчитать идентификатор элемента выше (ну технически перед этим идентификатором) внутри вектора на основе текущего элемента, на котором я нахожусь.

Иллюстрация:
скажем, у меня есть матрица 5х5,
Допустим, мой текущий идентификатор — 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

Теперь я хочу идентификатор элемента в векторе, который находится прямо над мной, который представляет собой идентификатор 3, номер первой строки 3. И это просто предполагает, что MAP_WIDTH = 5 и MAP_HEIGHT = 5.

1

Решение

8 - 5 = 3

Текущий — MAP_WIDTH = Выше

2

Другие решения

Вы можете легко определить (row,col) координаты с учетом ID:

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

Если вы хотите узнать, какова координата из элемента выше:

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

То же самое относится, если вы хотите знать, что является элементом ниже:

row++;
ID_below = row * MAP_WIDTH + col;
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) будет rect2lin (MAP_WIDTH, X, Y-1), который просто (Y-1) * MAP_WIDTH + X. Это прямо обобщает большее число измерений. Например, i = (z * h + y) * w + x для 3d и так далее.

0
По вопросам рекламы [email protected]