Skip to content

Capítulo 5: Arrays y Strings

5.1 Nivel Introductorio

Arrays unidimensionales

Un array (o arreglo) es una estructura de datos que almacena una colección de elementos del mismo tipo en ubicaciones de memoria contiguas. Los arrays permiten almacenar múltiples valores bajo un mismo nombre y acceder a ellos mediante índices.

Declaración de arrays

Sintaxis:

cpp
tipo nombreArray[tamaño];
  • tipo: Tipo de datos de los elementos.
  • nombreArray: Identificador del array.
  • tamaño: Número de elementos que contendrá el array.

Ejemplo:

cpp
int numeros[5]; // Declara un array de 5 enteros

Inicialización de arrays

Se pueden inicializar los elementos del array al momento de su declaración.

Ejemplo:

cpp
int numeros[5] = {1, 2, 3, 4, 5};

Si se proporciona menos valores de inicialización que el tamaño del array, los elementos restantes se inicializan a cero.

Acceso a elementos

Los elementos de un array se acceden utilizando índices que comienzan en cero.

Ejemplo:

cpp
int numeros[5] = {10, 20, 30, 40, 50};

std::cout << numeros[0] << std::endl; // Imprime 10
std::cout << numeros[3] << std::endl; // Imprime 40

Modificación de elementos

cpp
numeros[2] = 100; // Cambia el tercer elemento a 100

Manejo básico de cadenas de caracteres

En C++, las cadenas de caracteres pueden manejarse como arrays de char.

Declaración de cadenas

Ejemplo:

cpp
char mensaje[6] = {'H', 'o', 'l', 'a', '\0'};

El carácter '\0' es el terminador nulo que indica el final de la cadena.

Inicialización simplificada

cpp
char saludo[] = "Hola";

El compilador determina automáticamente el tamaño del array basado en la longitud de la cadena.

Acceso a caracteres individuales

cpp
std::cout << saludo[0] << std::endl; // Imprime 'H'

Funciones básicas de <cstring>

Incluye funciones para manipular cadenas de caracteres estilo C.

Ejemplo de función strlen:

cpp
#include <cstring>

int longitud = strlen(saludo); // Calcula la longitud de "Hola"

5.2 Nivel Intermedio

Arrays multidimensionales

Los arrays pueden tener más de una dimensión, permitiendo representar matrices y tablas.

Declaración de arrays bidimensionales

Sintaxis:

cpp
tipo nombreArray[fila][columna];

Ejemplo:

cpp
int matriz[3][3];

Inicialización de arrays bidimensionales

cpp
int matriz[2][2] = {
    {1, 2},
    {3, 4}
};

Acceso a elementos

cpp
int valor = matriz[1][0]; // Accede al elemento en la segunda fila, primera columna

Recorrido de arrays bidimensionales

cpp
for (int i = 0; i < 2; i++) {
    for (int j = 0; j < 2; j++) {
        std::cout << matriz[i][j] << " ";
    }
    std::cout << std::endl;
}

La clase std::string y sus operaciones

La clase std::string es parte de la Biblioteca Estándar de C++ y proporciona una forma más segura y funcional de manejar cadenas de caracteres.

Declaración e inicialización

cpp
#include <string>

std::string nombre = "Carlos";

Operaciones básicas

  • Concatenación:

    cpp
    std::string saludo = "Hola, " + nombre;
  • Longitud de la cadena:

    cpp
    size_t longitud = saludo.length();
  • Acceso a caracteres:

    cpp
    char letra = saludo[0]; // 'H'
  • Subcadenas:

    cpp
    std::string sub = saludo.substr(0, 4); // "Hola"
  • Búsqueda de caracteres o subcadenas:

    cpp
    size_t posicion = saludo.find("Carlos"); // Devuelve la posición donde inicia "Carlos"

Entrada de cadenas con espacios

Para leer una línea completa incluyendo espacios, se utiliza std::getline.

Ejemplo:

cpp
std::string texto;
std::cout << "Ingresa una línea de texto: ";
std::getline(std::cin, texto);

5.3 Nivel Avanzado

Punteros y arrays

Un array puede considerarse como un puntero al primer elemento. Esto permite ciertas operaciones avanzadas.

Relación entre arrays y punteros

cpp
int numeros[5] = {10, 20, 30, 40, 50};
int* ptr = numeros; // ptr apunta al primer elemento de numeros

Acceso a elementos usando punteros

cpp
std::cout << *(ptr + 2) << std::endl; // Imprime 30

Paso de arrays a funciones

Los arrays se pasan a funciones como punteros.

Ejemplo:

cpp
void imprimirArray(int* arr, int tam) {
    for (int i = 0; i < tam; i++) {
        std::cout << arr[i] << " ";
    }
}

imprimirArray(numeros, 5);

Manipulación avanzada de cadenas

Concatenación y modificación

cpp
std::string texto1 = "Hola";
std::string texto2 = " Mundo";

std::string saludo = texto1 + texto2; // "Hola Mundo"

Inserción y eliminación

  • Inserción:

    cpp
    saludo.insert(5, ","); // "Hola, Mundo"
  • Eliminación:

    cpp
    saludo.erase(5, 1); // Elimina la coma

Reemplazo de subcadenas

cpp
saludo.replace(5, 1, " querido"); // "Hola querido Mundo"

Conversión entre std::string y cadenas estilo C

  • De std::string a char*:

    cpp
    const char* c_str = saludo.c_str();
  • De char* a std::string:

    cpp
    char textoC[] = "Texto en C";
    std::string textoCpp = textoC;

Uso de std::array y std::vector

std::array

Es una clase de la STL que encapsula arrays de tamaño fijo.

Declaración:

cpp
#include <array>

std::array<int, 5> numeros = {10, 20, 30, 40, 50};

Acceso a elementos:

cpp
int valor = numeros[2]; // 30

Métodos útiles:

  • numeros.size(): Devuelve el tamaño del array.
  • numeros.at(3): Accede al elemento con verificación de límites.

std::vector

Es un array dinámico que puede cambiar de tamaño en tiempo de ejecución.

Declaración:

cpp
#include <vector>

std::vector<int> lista;

Agregar elementos:

cpp
lista.push_back(10);
lista.push_back(20);

Acceso a elementos:

cpp
int valor = lista[0]; // 10

Recorrido:

cpp
for (int elemento : lista) {
    std::cout << elemento << " ";
}

Métodos útiles:

  • lista.size(): Tamaño actual del vector.
  • lista.empty(): Verifica si el vector está vacío.
  • lista.clear(): Elimina todos los elementos.

Comparación entre std::array y std::vector

  • std::array:

    • Tamaño fijo en tiempo de compilación.
    • Más eficiente en memoria y rendimiento para tamaños pequeños.
    • No puede cambiar de tamaño después de su creación.
  • std::vector:

    • Tamaño dinámico, puede crecer o disminuir.
    • Más flexible para colecciones cuyo tamaño no se conoce de antemano.
    • Ligera sobrecarga en memoria y rendimiento debido a la gestión dinámica.