C++ <vector> funciones begin / end

C++ 容器类 <vector>C++ clase de contenedor <vector>


beginyendson las funciones de iterador más importantes en vector, utilizadas paraobtener los iteradores de inicio y fin del contenedor。

beginyendson funciones miembro de la clase de contenedor:

  • begindevuelve un iterador que apunta al primer elemento del contenedoriterador
  • enddevuelve un iterador que apunta a la posición después del último elemento del contenedoriterador(iterador centinela)

Estas dos funciones son la base de los algoritmos de la biblioteca estándar de C++ y del bucle for de rango.

Definición de palabras: beginsignifica "inicio",endsignifica "fin".


Sintaxis básica y parámetros

beginyendson funciones miembro de la clase de contenedor, no requieren parámetros para llamarlas.

Formato de sintaxis

iterator begin();
const_iterator begin() const;

iterator end();
const_iterator end() const;

Descripción de parámetros

  • Parámetros: Sin parámetros
    • Estas funciones no aceptan ningún parámetro.

Descripción de la función

  • Valor de retorno:
    • begin()Devuelve un iterador que apunta al primer elemento.
    • end()Devuelve un iterador que apunta a la posición después del último elemento (centinela).
  • Efecto: El iterador devuelto se puede usar para recorrer el contenedor o junto con algoritmos.
  • Nota: end()El iterador devuelto apunta a una posición "virtual", no se puede desreferenciar, solo se puede usar para comparar.

Ejemplo

A través de una serie de ejemplos, dominemos completamentebeginyendel uso de.

Ejemplo 1: Uso básico - Recorrer un contenedor

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {10, 20, 30, 40, 50};

    // Recorrer usando iterador
    std::cout << "Recorrido con iterador: ";
    for(auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

Resultado esperado:

使用迭代器遍历: 10 20 30 40 50

Análisis del código:

  1. numbers.begin()Devuelve un iterador que apunta al primer elemento (10).
  2. numbers.end()Devuelve un iterador que apunta a la posición después del último elemento.
  3. La condición del bucleit != numbers.end()asegura que se recorran todos los elementos.

Ejemplo 2: Bucle for de rango

El bucle for de rango introducido en C++11 utiliza internamentebeginyend。

Ejemplo

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::vector<std::string> names = {"Alice", "Bob", "Charlie"};

    // Bucle for de rango (internamente usa begin/end)
    std::cout << "Usando bucle for de rango: ";
    for(const auto& name : names) {
        std::cout << name << " ";
    }
    std::cout << std::endl;

    return 0;
}

Resultado esperado:

使用范围 for 循环: Alice Bob Charlie

Análisis del código:

  • El bucle for de rango es una forma concisa de usar iteradores.
  • El compilador llama automáticamente abegin()yend()。

Ejemplo 3: Uso de algoritmos STL

Los algoritmos de la biblioteca estándar necesitan iteradores para especificar el rango.

Ejemplo

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {5, 2, 8, 1, 9, 3};

    // Ordenar
    std::sort(numbers.begin(), numbers.end());

    std::cout << "Después de ordenar: ";
    for(int n : numbers) {
        std::cout << n << " ";
    }
    std::cout << std::endl;

    // Buscar elemento
    auto it = std::find(numbers.begin(), numbers.end(), 8);
    if(it != numbers.end()) {
        std::cout << "Elemento encontrado: " << *it << std::endl;
    }

    return 0;
}

Resultado esperado:

排序后: 1 2 3 5 8 9
找到元素: 8

Análisis del código:

  • std::sort(begin, end)Usa iteradores para especificar el rango de ordenamiento.
  • std::find(begin, end, value)Usa iteradores para especificar el rango de búsqueda.

Ejemplo 4: Iterador inverso

Usandorbeginyrendse puede recorrer el contenedor en orden inverso.

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // Recorrido hacia adelante
    std::cout << "Hacia adelante: ";
    for(auto it = numbers.begin(); it != numbers.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // Recorrido inverso (usando rbegin/rend)
    std::cout << "Inverso: ";
    for(auto it = numbers.rbegin(); it != numbers.rend(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

Resultado esperado:

正向: 1 2 3 4 5
反向: 5 4 3 2 1

Análisis del código:

  • rbegin()Devuelve un iterador inverso que apunta al último elemento.
  • rend()Devuelve un iterador inverso que apunta antes del primer elemento.

Ejemplo 5: Aritmética de iteradores

Los iteradores admiten aritmética, lo que permite saltar rápidamente a una posición específica.

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {10, 20, 30, 40, 50, 60, 70};

    // Obtener el tercer elemento (índice 2)
    auto it = numbers.begin() + 2;
    std::cout << "begin() + 2 = " << *it << std::endl;

    // Calcular la distancia entre dos iteradores
    auto first = numbers.begin();
    auto last = numbers.end();
    auto distance = last - first;
    std::cout << "Tamaño del contenedor (distancia): " << distance << std::endl;

    // Obtener el elemento del medio
    auto mid = numbers.begin() + (numbers.size() / 2);
    std::cout << "Elemento del medio: " << *mid << std::endl;

    return 0;
}

Resultado esperado:

begin() + 2 = 30
容器大小(距离): 7
中间元素: 40

Análisis del código:

  • Los iteradores admiten operaciones aritméticas como+、-operaciones aritméticas, etc.
  • Se puede usarend() - begin()para calcular el tamaño del contenedor.

Ejemplo 6: Conversión entre iterador e índice

Los iteradores y los índices se pueden convertir entre sí.

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {10, 20, 30, 40, 50};

    // Convertir índice a iterador
    size_t index = 2;
    auto it = numbers.begin() + index;
    std::cout << "Índice " << index << " elemento correspondiente: " << *it << std::endl;

    // Convertir iterador a índice
    auto iter = numbers.begin() + 3;
    size_t idx = iter - numbers.begin();
    std::cout << "Índice correspondiente al iterador: " << idx << std::endl;

    return 0;
}

Resultado esperado:

索引 2 对应的元素: 30
迭代器对应的索引: 3

Análisis del código:

  • begin() + indexConvierte el índice en un iterador.
  • iter - begin()Convierte el iterador en un índice.

Ejemplo 7: Modificar elementos usando iteradores

El iterador devuelve una referencia, que se puede usar para modificar elementos.

Ejemplo

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    std::cout << "Antes de modificar: ";
    for(int n : numbers) std::cout << n << " ";
    std::cout << std::endl;

    // Usar iterador para multiplicar todos los elementos por 2
    for(auto it = numbers.begin(); it != numbers.end(); ++it) {
        *it *= 2;
    }

    std::cout << "Después de modificar: ";
    for(int n : numbers) std::cout << n << " ";
    std::cout << std::endl;

    return 0;
}

Resultado esperado:

修改前: 1 2 3 4 5
修改后: 2 4 6 8 10

Análisis del código:

  • La desreferencia del iterador (*it) devuelve una referencia al elemento.
  • Se puede modificar directamente esta referencia para cambiar el valor del elemento.

C++ 容器类 <vector>C++ clase de contenedor <vector>

Otras extensiones