cpp::daily - std::set, std::multiset e std::move

Episódio 019 .


cpp-daily-std-set-multiset-move

std::set

É um tipo de contêiner associativo em que cada elemento deve ser único. O valor do elemento não pode ser modificado depois de adicionado ao conjunto, embora seja possível remover e adicionar o valor modificado desse elemento.

Exemplo:

#include <iostream>
#include <set>

int main(){
  std::set<int> s;

  // adicionando elementos ao set
  s.insert( 11 );
  s.insert( 13 );
  s.insert( 17 );
  s.insert( 8 );

  // Imprime todos elementos do set
  // Vai imprimir do maior para o menor por padrão
  for( auto z : s ){
    std::cout << z << ' ';
  }
  std::cout << '\n';

  // remove elementos do set
  s.erase( 8 );
  s.erase( 13 );

  // Imprime todos elementos do set após remoção de alguns
  for( auto z : s ){
    std::cout << z << ' ';
  }

  std::cout << '\n';
  return 0;
}


std::multiset

É similar ao std::set, mas armazena elementos duplicados, exemplo:

Com std::set se duplicarmos os números assim:

#include <iostream>
#include <set>

int main(){
  std::set<int> s;

  s.insert( 11 );
  s.insert( 13 );
  s.insert( 17 );
  s.insert( 8 );
  s.insert( 11 );
  s.insert( 13 );
  s.insert( 17 );
  s.insert( 8 );


  for( auto z : s ){
    std::cout << z << ' ';
  }
  std::cout << '\n';

  return 0;
}

A saída será: 8 11 13 17 , ou seja, não sairá duplicada.

Mas se usarmos std::multiset, assim:

#include <iostream>
#include <set>

int main(){
  std::multiset<int> m;

  m.insert( 11 );
  m.insert( 13 );
  m.insert( 17 );
  m.insert( 8 );
  m.insert( 11 );
  m.insert( 13 );
  m.insert( 17 );
  m.insert( 8 );


  for( auto z : m ){
    std::cout << z << ' ';
  }
  std::cout << '\n';

  return 0;
}

A saída será: 8 8 11 11 13 13 17 17


std::move

Para entender std::move vamos lembrar daquele cpp::daily que trocamos os valores das variáveis com std::swap .

Na verdade aquilo foi possível usando uma variável temporária, então aquilo teve cópia na memória do valor. Já com std::move a troca é realmente feita sem fazer cópia, exemplo baseado naquele:

T tmp(std::move(a));
a = std::move(b);   
b = std::move(tmp);

Isso tem um melhor desempenho que aquele exemplo.


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!