Tengo un vector 2d que se ve así:

a b c
d f g  // actual size is 32 x 32
h i j

Y quiero cambiar las filas / columnas:

d f g          h i j           b c a           c a b
h i j <-- up   a b c <-- down  f g d <-- left  g d f <-- right  
a b c          d f g           i j h           j h i     

En Python puedo lograr todo eso en ingeniosas líneas, como matrix = [row[-1:] + row[:-1] for row in matrix] para mover las columnas a la derecha. Pero, c ++ no usa el práctico : en índices de lista o índices negativos. Bueno, no índices negativos como en Python al menos.

De todos modos, estoy buscando una buena forma de hacer esto. He visto muchas otras preguntas SO sobre el intercambio de filas o la rotación, pero ninguna de las que he visto ha resuelto mi problema.

Aquí está mi primera versión de mover columnas a la derecha:

vector<vector<string>> matrix{{"a","b","c"}, {"d","e","f"}, {"g","h","i"}};

for (int i = 0; i < matrix.size(); i++)
{
    vector<string> col{matrix[i][2], matrix[i][0], matrix[i][1]};
    matrix[i] = col;
}

Esto funciona, pero será muy largo una vez que escriba los 32 índices. Esperaba que alguien pudiera señalarme algo más corto y más flexible. ¡Gracias!

2
Have a nice day 6 mar. 2021 a las 00:13

1 respuesta

La mejor respuesta

Hay std::rotate() que puede hacer esto por usted. Para rotar el contenido de cada fila:

vector<vector<string>> matrix{{"a","b","c"}, {"d","e","f"}, {"g","h","i"}};

for (auto &row: matrix)
{
    std::rotate(row.begin(), row.begin() + 1, row.end());
}

Para rotar el contenido de las columnas, simplemente rote el vector exterior:

std::rotate(matrix.begin(), matrix.begin() + 1, matrix.end());
3
G. Sliepen 5 mar. 2021 a las 21:19