C++ <vector> funciones begin / end
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 contenedoriteradorenddevuelve 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 <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:
numbers.begin()Devuelve un iterador que apunta al primer elemento (10).numbers.end()Devuelve un iterador que apunta a la posición después del último elemento.- La condición del bucle
it != 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 <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 a
begin()yend()。
Ejemplo 3: Uso de algoritmos STL
Los algoritmos de la biblioteca estándar necesitan iteradores para especificar el rango.
Ejemplo
#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 <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 <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 usar
end() - 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 <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 <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.
Otras extensiones