No cpp::daily de hoje vamos conhecer um recurso muito utilizado no desenvolvimento de games.
std::move
std::move
é usado para indicar que um objeto t
pode ser “movido de..para”, ou seja, permitindo a transferência eficiente de recursos de t
para outro objeto.
Em particular, std::move
produz uma expressão xvalue que identifica seu argumento t
. É exatamente equivalente a um static_cast
para um tipo de referência rvalue.
Sua sintaxe é: std::move(first,last,result)
.
Vamos supor que estamos criando um jogo da velha e possuímos um namespace
com a seguinte struct
que armazena as coordenadas do nosso game:
namespace terroo {
struct Coordenadas {
int x, y;
};
}
E possuímos os vectores(v1
, v2
e v3
) com as seguintes coordenadas:
std::vector<terroo::Coordenadas> v1 = { {0,0}, {0,1}, {0,2} }, v2, v3;
for (size_t i = 0; i < v1.size(); ++i) {
v2.push_back({1, v1[i].y});
v3.push_back({2, v1[i].y});
}
for (size_t i = 0; i < v1.size(); ++i) {
std::cout << v1[i].x << ',' << v1[i].y << ' ';
}
std::cout << '\n';
for (size_t i = 0; i < v2.size(); ++i) {
std::cout << v2[i].x << ',' << v2[i].y << ' ';
}
std::cout << '\n';
for (size_t i = 0; i < v3.size(); ++i) {
std::cout << v3[i].x << ',' << v3[i].y << ' ';
}
std::cout << '\n';
A saída será:
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
Agora vamos supor que um jogador venceu marcando a diagonal da esquerda para a direita.
Utilizando std::move
para a gente mover o 0,0
para o 1,1
e para o 2,2
usaríamos esse código:
std::move(v1.begin(), v1.begin() + 1, v2.begin() + 1); // move 0,0 para 1,1
std::move(v1.begin(), v1.begin() + 1, v3.begin() + 2); // move 0,0 para 2,2
Rodando nosso código e exibindo as saída após o jogador ganhar seria:
0,0 0,1 0,2
1,0 1,1 1,2
2,0 2,1 2,2
-----------
0,0 0,1 0,2
1,0 0,0 1,2
2,0 2,1 0,0
Código completo criado para esse exemplo:
#include <iostream>
#include <vector>
namespace terroo {
struct Coordenadas {
int x, y;
};
}
int main(){
std::vector<terroo::Coordenadas> v1 = { {0,0}, {0,1}, {0,2} }, v2, v3;
for (size_t i = 0; i < v1.size(); ++i) {
v2.push_back({1, v1[i].y});
v3.push_back({2, v1[i].y});
}
for (size_t i = 0; i < v1.size(); ++i) {
std::cout << v1[i].x << ',' << v1[i].y << ' ';
}
std::cout << '\n';
for (size_t i = 0; i < v2.size(); ++i) {
std::cout << v2[i].x << ',' << v2[i].y << ' ';
}
std::cout << '\n';
for (size_t i = 0; i < v3.size(); ++i) {
std::cout << v3[i].x << ',' << v3[i].y << ' ';
}
std::cout << '\n';
std::cout << "------" << '\n';
std::move(v1.begin(), v1.begin() + 1, v2.begin() + 1);
std::move(v1.begin(), v1.begin() + 1, v3.begin() + 2);
for (size_t i = 0; i < v1.size(); ++i) {
std::cout << v1[i].x << ',' << v1[i].y << ' ';
}
std::cout << '\n';
for (size_t i = 0; i < v2.size(); ++i) {
std::cout << v2[i].x << ',' << v2[i].y << ' ';
}
std::cout << '\n';
for (size_t i = 0; i < v3.size(); ++i) {
std::cout << v3[i].x << ',' << v3[i].y << ' ';
}
std::cout << '\n';
return 0;
}
Muito simple, né?!
Por hoje é só, são pequenas doses diárias que farão sempre nos manter antenado com o C++ !
Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:
Acesse o endereço: