Estruturas de Dados em C++: Construindo Programas Eficientes com Arrays, Structs e Mais
Arrays em C/C++ permitem definir variáveis que combinam vários itens de dados do mesmo tipo, mas structure (estrutura) é outro tipo de dado definido pelo usuário que permite combinar itens de dados de tipos diferentes.
Estruturas são usadas para representar um registro. Suponha que você queira acompanhar seus livros em uma biblioteca. Você pode querer rastrear os seguintes atributos sobre cada livro:
- Título
- Autor
- Assunto
- ID do Livro
Definindo uma Estrutura
Para definir uma estrutura, você deve usar a instrução struct. A instrução struct define um novo tipo de dado, com mais de um membro, para seu programa. O formato da instrução struct é este:
struct [structure tag] {
member definition;
member definition;
...
member definition;
} [one or more structure variables];
O structure tag (tag da estrutura) é opcional e cada definição de membro é uma definição de variável normal, como int i; ou float f; ou qualquer outra definição de variável válida. No final da definição da estrutura, antes do ponto e vírgula final, você pode especificar uma ou mais variáveis de estrutura, mas é opcional. Aqui está como você declararia a estrutura Book:
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
Acessando Membros da Estrutura
Para acessar qualquer membro de uma estrutura, usamos o operador de acesso a membro (.). O operador de acesso a membro é codificado como um ponto entre o nome da variável de estrutura e o membro da estrutura que desejamos acessar. Você usaria a palavra-chave struct para definir variáveis de tipo estrutura. O exemplo a seguir explica o uso de estrutura:
#include <iostream>
#include <cstring>
using namespace std;
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1; // Declara Book1 do tipo Book
struct Books Book2; // Declara Book2 do tipo Book
// especificação livro 1
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// especificação livro 2
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Imprime info Book1
cout << "Book 1 title: " << Book1.title << endl;
cout << "Book 1 author: " << Book1.author << endl;
cout << "Book 1 subject: " << Book1.subject << endl;
cout << "Book 1 id: " << Book1.book_id << endl;
// Imprime info Book2
cout << "Book 2 title: " << Book2.title << endl;
cout << "Book 2 author: " << Book2.author << endl;
cout << "Book 2 subject: " << Book2.subject << endl;
cout << "Book 2 id: " << Book2.book_id << endl;
return 0;
}
Quando o código acima é compilado e executado, produz o seguinte resultado:
Book 1 title: Learn C++ Programming Book 1 author: Chand Miyan Book 1 subject: C++ Programming Book 1 id: 6495407 Book 2 title: Telecom Billing Book 2 author: Yakit Singha Book 2 subject: Telecom Book 2 id: 6495700
Estruturas como Argumentos de Função
Você pode passar uma estrutura como argumento de função de forma muito similar a como passa qualquer outra variável ou ponteiro. Você acessaria variáveis de estrutura da forma similar ao exemplo acima:
#include <iostream>
#include <cstring>
using namespace std;
void printBook(struct Books book);
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1;
struct Books Book2;
// book 1 specification
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// book 2 specification
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Print Book1 info
printBook(Book1);
// Print Book2 info
printBook(Book2);
return 0;
}
void printBook(struct Books book) {
cout << "Book title: " << book.title << endl;
cout << "Book author: " << book.author << endl;
cout << "Book subject: " << book.subject << endl;
cout << "Book id: " << book.book_id << endl;
}
Quando o código acima é compilado e executado, produz o seguinte resultado:
Book title: Learn C++ Programming Book author: Chand Miyan Book subject: C++ Programming Book id: 6495407 Book title: Telecom Billing Book author: Yakit Singha Book subject: Telecom Book id: 6495700
Ponteiros para Estruturas
Você pode definir ponteiros para estruturas de forma muito similar a como define ponteiro para qualquer outra variável:
struct Books *struct_pointer;
Agora, você pode armazenar o endereço de uma variável de estrutura no ponteiro definido acima. Para encontrar o endereço de uma variável de estrutura, coloque o operador & antes do nome da estrutura:
struct_pointer = &Book1;
Para acessar membros de uma estrutura usando um ponteiro para essa estrutura, você deve usar o operador -> da seguinte forma:
struct_pointer->title;
Vamos reescrever o exemplo acima usando ponteiro de estrutura, espero que isso facilite o entendimento do conceito:
#include <iostream>
#include <cstring>
using namespace std;
void printBook(struct Books *book);
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main() {
struct Books Book1;
struct Books Book2;
// Book 1 specification
strcpy(Book1.title, "Learn C++ Programming");
strcpy(Book1.author, "Chand Miyan");
strcpy(Book1.subject, "C++ Programming");
Book1.book_id = 6495407;
// Book 2 specification
strcpy(Book2.title, "Telecom Billing");
strcpy(Book2.author, "Yakit Singha");
strcpy(Book2.subject, "Telecom");
Book2.book_id = 6495700;
// Print Book1 info, passando endereço da estrutura
printBook(&Book1);
// Print Book2 info, passando endereço da estrutura
printBook(&Book2);
return 0;
}
// Esta função aceita ponteiro para estrutura como parâmetro.
void printBook(struct Books *book) {
cout << "Book title: " << book->title << endl;
cout << "Book author: " << book->author << endl;
cout << "Book subject: " << book->subject << endl;
cout << "Book id: " << book->book_id << endl;
}
Quando o código acima é compilado e executado, produz o seguinte resultado:
Book title: Learn C++ Programming Book author: Chand Miyan Book subject: C++ Programming Book id: 6495407 Book title: Telecom Billing Book author: Yakit Singha Book subject: Telecom Book id: 6495700
A Palavra-chave typedef
Existe uma maneira mais fácil de definir structs ou você poderia criar "aliases" para tipos que cria. Por exemplo:
typedef struct {
char title[50];
char author[50];
char subject[100];
int book_id;
} Books;
Agora, você pode usar Books diretamente para definir variáveis do tipo Books sem usar a palavra-chave struct. O exemplo a seguir:
Books Book1, Book2;
Você pode usar a palavra-chave typedef para não-structs também, da seguinte forma:
typedef long int *pint32; pint32 x, y, z;
x, y e z são todos ponteiros para long ints.
Linguagem C
- Entendendo Tipos de Dados em C++: Fundamentos, Modificadores e Boas Práticas
- Dominando Operadores em C++: Guia Completo com Exemplos Práticos
- Comentários em C++: Boas Práticas para Código Legível e Manutenível
- Dominando o Tipo Char em C++: Declaração, ASCII e Técnicas de Conversão
- Revolucionando Armazenamento de Dados: Nanoestruturas Magnéticas de Próxima Geração com Capas de Invisibilidade
- Estruturas de Dados em Java: Explorando Classes Core e Collections Framework
- Dominando Estruturas em C: Organize Dados Complexos Eficientemente
- Typedef em C Explicado: Simplifique Seu Código com Nomes de Tipos Personalizados
- Estruturas de Dados em C++: Construindo Programas Eficientes com Arrays, Structs e Mais
- Dominando Abstração de Dados em C++: Simplifique Design com Separação Interface-Implementação