Structs
Editado por: Bruno Rafael Comin Scheffel
Conteúdo
Por que precisamos de structs?
Até agora, cada variável armazena um único tipo. Mas e quando precisamos representar algo mais complexo, como um aluno com nome, idade e nota?
Sem Struct
string nome[3];
int idade[3];
double nota[3];
Com Struct
struct Aluno {
string nome;
int idade;
double nota;
};
Aluno turma[3];
Sem a struct, os dados ficam espalhados em arrays separadas, onde qualquer erro de índice desvincula os dados de um aluno dos outros. Com a struct, o nome, idade e nota pertencem ao mesmo objeto e estão sempre juntas.
O que é uma Struct
Uma struct pode ser vista como um conjunto de variáveis sob o mesmo nome, e cada uma delas pode ter qualquer tipo. A ideia básica por trás da estrutura é criar apenas um tipo de dado que contenha vários campos, que são outras variáveis. Em outras palavras, é uma variável que contém dentro de si outras variáveis.
Declaração
struct NomeDaStruct {
tipo1 campo1;
tipo2 campo2;
tipo3 campo3;
};
Criando e acessando variáveis
Uma vez definida a estrutura, uma variável pode ser declarada de modo similar aos tipos já existentes:
NomeDaStruct nome_variavel;
Com a variável do tipo da estrutura definida, acessamos seus campos usando o “.” (ponto), seguido do nome do membro:
nome_variavel.campo1;
Inicialização de structs
Assim como nos arrays, uma estrutura também pode ser inicializada. Para isso, na declaração da variável do tipo da estrutura, deve-se definir uma lista de valores, delimitados por chaves.
NomeDaStruct nome_variavel = {valor1, valor2, valor3}
Exemplo
Vamos fazer uma struct para Aluno, após isso, vamos criar variáveis do tipo Aluno e atribuir valores a elas.
struct Aluno {
string nome;
int idade;
double nota;
};
Aluno aluno01;
aluno01.nome = "Diego";
aluno01.idade = 19;
aluno01.nota = 9;
Aluno aluno02 = {"José", 19, 1};
cout << "Dados do Aluno 01:" << endl;
cout << "Nome: " << aluno01.nome << endl;
cout << "Idade: " << aluno01.idade << endl;
cout << "Nota: " << aluno01.nota << endl;
cout << "-----" << endl;
cout << "Dados do Aluno 02:" << endl;
cout << "Nome: " << aluno02.nome << endl;
cout << "Idade: " << aluno02.idade << endl;
cout << "Nota: " << aluno02.nota << endl;
Vector de estruturas
Uma combinação muito usadas é o array ou vector, que permite armazenar várias entidades do mesmo tipo de forma organizada. A declaração de um array ou vetor de estruturas é similar à declaração deles nos tipos básicos.
struct Aluno {
string nome;
int idade;
double nota;
};
// Array
Aluno turma[2];
turma[0].nome = "Diego";
turma[0].idade = 19;
turma[0].nota = 9;
turma[1] = {"José", 19, 1.2}
// Vector
vector<Aluno> outraTurma = {{"Gabriel", 20, 3.0}, {"Pedro", 20, 7.0}};
turma.push_back({"Isa", 20, 8.2});
Também podemos fazer a inicialização e declaração na mesma linha:
Aluno outraTurma[2] = {
{"Felipe", 17, 2},
{"Gabi", 22, 10}
};
Conteúdo Adicional
Estruturas aninhadas
Uma estrutura pode agrupar um número arbitrário de variáveis de tipos diferentes. Como uma estrutura também é um tipo de dado, podemos aninhar elas.
Exemplo
struct endereco{
char rua[50];
int numero;
};
struct cadastro{
char nome[50];
int idade;
endereco ender;
};
Exercícios
Torneio da Semana:
1581 - International Chat — lê mensagens com remetente e conteúdo, boa para struct com dois campos string.
1069 - Diamantes e Areia — lê pares de valores, natural modelar como struct.
1042 - Sort Simples — três valores por entidade, ordenação por um campo específico. Clássico.
Um pouco mais elaborados
1244 - Sort by Length — strings com critério de ordenação composto (tamanho, depois lexicográfico). Bom pra praticar operator< com dois critérios.
1548 - Candles — entidades com dois atributos e ordenação. Direto ao ponto.
Slides
https://embed.figma.com/deck/vydxPdr8TYoAaeoFSUd2SR?embed-host=notion&footer=false&theme=system
