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

Structs e Dados Compostos