Cómo extraer un subvector de un vector en C++
-
Utilice la notación de inicialización de lista
{}
para extraer un subvector de un vector -
Use la función
copy()
para extraer un subvector de un vector
Este artículo explicará varios métodos de cómo extraer un subvector de un vector C++.
Utilice la notación de inicialización de lista {}
para extraer un subvector de un vector
Una forma de extraer un subvector es inicializar un nuevo vector
con los elementos vectoriales originales. El siguiente método especifica elementos con iteradores que apuntan a las ubicaciones deseadas (los primeros 5 elementos de int_vec
). Note que, en este ejemplo, usamos el método std::copy
para dar salida a los elementos vectoriales a la consola.
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
vector<int> int_vec{1, 23, 43, 324, 10, 222, 424,
649, 1092, 110, 129, 40, 3024};
vector<int> sub_vec{int_vec.begin(), int_vec.begin() + 5};
cout << std::left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << std::left << setw(10) << "subvec: ";
copy(sub_vec.begin(), sub_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
return EXIT_SUCCESS;
}
Resultado:
vec: 1; 23; 43; 324; 10; 222; 424; 649; 1092; 110; 129; 40; 3024;
subvec: 1; 23; 43; 324; 10;
Alternativamente, puede inicializar una variable subvectorial especificando los punteros al elemento deseado (por ejemplo &int_vec[index]
) del vector original:
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
vector<int> int_vec{1, 23, 43, 324, 10, 222, 424,
649, 1092, 110, 129, 40, 3024};
vector<int> sub_vec{&int_vec[0], &int_vec[5]};
cout << std::left << setw(10) << "vec: ";
copy(int_vec.begin(), int_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
cout << std::left << setw(10) << "subvec: ";
copy(sub_vec.begin(), sub_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
return EXIT_SUCCESS;
}
Resultado:
vec: 1; 23; 43; 324; 10; 222; 424; 649; 1092; 110; 129; 40; 3024;
subvec: 1; 23; 43; 324; 10;
Use la función copy()
para extraer un subvector de un vector
La función copy()
es una poderosa herramienta para manipular los datos basados en el rango. En este caso, la utilizaremos para copiar literalmente un elemento específico de un vector
a otro (entendido como un subvector). En primer lugar declaramos una variable sub_vec
con algunos elementos para ser copiados. A continuación, pasamos el rango vector
original como argumentos a la función copy()
y el iterador begin
al vector
de destino.
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::setw;
using std::vector;
constexpr int NUM_ELEMS_TO_COPY = 6;
int main() {
vector<int> int_vec{1, 23, 43, 324, 10, 222, 424,
649, 1092, 110, 129, 40, 3024};
vector<int> sub_vec(NUM_ELEMS_TO_COPY);
copy(&int_vec[0], &int_vec[NUM_ELEMS_TO_COPY], sub_vec.begin());
cout << std::left << setw(10) << "subvec: ";
copy(sub_vec.begin(), sub_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
return EXIT_SUCCESS;
}
subvec: 1; 23; 43; 324; 10; 222;
Otra poderosa técnica que utiliza el método copy()
es añadir un subvector a cualquier variable vector
existente. El siguiente código de ejemplo demuestra esto empujando 5 elementos extraídos de vuelta a la variable sub_vec
usando la plantilla de la función std::back_inserter
. Ten en cuenta que el método copy
opera en el rango de elementos como [first, last)
.
#include <iomanip>
#include <iostream>
#include <iterator>
#include <vector>
using std::copy;
using std::cout;
using std::endl;
using std::setw;
using std::vector;
int main() {
vector<int> int_vec{1, 23, 43, 324, 10, 222, 424,
649, 1092, 110, 129, 40, 3024};
vector<int> sub_vec = {1, 2, 3, 4, 5, 6};
copy(&int_vec[0], &int_vec[5], std::back_inserter(sub_vec));
cout << std::left << setw(10) << "subvec: ";
copy(sub_vec.begin(), sub_vec.end(), std::ostream_iterator<int>(cout, "; "));
cout << endl;
return EXIT_SUCCESS;
}
subvec: 1; 2; 3; 4; 5; 6; 1; 23; 43; 324; 10;
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook