Utilizando std::move para mover elementos em vectores

Conceito muito utilizado no desenvolvimento de games.


Utilizando std::move para mover elementos em vectores

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).

Exemplos de uso

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++ !

Acompanhe o cpp::daily

Deseja aprender C++ e criar seus programas Gráficos e para Terminal com portabilidade para Linux e Windows?

Então se inscreva nos nossos Cursos de C++ Moderno . Você aprender criar:

Acesse o endereço:

https://terminalroot.com.br/cpp/ e saiba mais!


cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!