Supongo que tengo un vector con los valores [1,2,3,4,5,6,7,8,9,10]. Quiero crear un nuevo vector que se refiera, por ejemplo, a [5,6,7,8]. Me imagino que esto es solo una cuestión de crear un vector con punteros o tengo que push_back todos los valores intermedios que necesito?Creando un nuevo subvector de C++?
16
A
Respuesta
36
Uno de constructor std::vector
's acepta un rango:
std::vector<int> v;
// Populate v.
for (int i = 1; i <= 10; i++) v.push_back(i);
// Construct v1 from subrange in v.
std::vector<int> v1(v.begin() + 4, v.end() - 2);
4
Usted no tiene que utilizar push_back
si no quiere, puede utilizar std::copy
:
std::vector<int> subvector;
copy (v1.begin() + 4, v1.begin() + 8, std::back_inserter(subvector));
3
I haría lo siguiente:
#include <vector>
#include <iostream>
using namespace std;
void printvec(vector<int>& v){
for(int i = 0;i < v.size();i++){
cout << v[i] << " ";
}
cout << endl;
}
int main(){
vector<int> v;
for(int i = 1;i <= 10;i++) v.push_back(i);
printvec(v);
vector<int> v2(v.begin()+4, v.end()-2);
printvec(v2);
return 0;
}
~
4
Esto es bastante fácil de hacer con std::valarray
en lugar de un vector:
#include <valarray>
#include <iostream>
#include <iterator>
#include <algorithm>
int main() {
const std::valarray<int> arr={0,1,2,3,4,5,6,7,8,9,10};
const std::valarray<int>& slice = arr[std::slice(5, // start pos
4, // size
1 // stride
)];
}
que tiene una "rebanada" de la valarray, más genéricamente de un vector.
Para un vector que puede hacerlo con el constructor que toma dos iteradores sin embargo:
const std::vector<int> arr={0,1,2,3,4,5,6,7,8,9,10};
std::vector<int> slice(arr.begin()+5, arr.begin()+9);
Cuestiones relacionadas
- 1. Creando un nuevo vector usando una transformación
- 2. Creando un nuevo dict en Python
- 3. creando un nuevo archivo en eclipse
- 4. Creando un nuevo corpus con NLTK
- 5. Cómo conseguir un subvector resuelto de un vector ordenado, rápido
- 6. Creando un nuevo Guid dentro de un fragmento de código usando C#
- 7. Creando un android.graphics.Bitmap de C++
- 8. Creando un nuevo complemento de Firefox: ¿XUL o Jetpack?
- 9. En Node.js, ¿estoy creando un nuevo objeto cuando "Requerir"?
- 10. C# "El parámetro no es válido". creando un nuevo mapa de bits
- 11. Creando un mapa de lambdas en C++
- 12. Creando un tipo de porcentaje en C#
- 13. Creando un nuevo proyecto a partir de un esqueleto de proyecto usando git
- 14. C++ 11: ¿un nuevo idioma?
- 15. Creando un archivo Zip programáticamente C++
- 16. Creando un control TabPage personalizado en C#
- 17. C++ Win32api, creando un cuadro de diálogo sin recurso
- 18. Creando estructuras C en Cython
- 19. Creando algo imprimible en C#
- 20. C# Creando y usando funciones
- 21. Creando un servicio de automatizador para crear un nuevo documento en el directorio actual
- 22. C# Uso de nuevo []
- 23. Django Tastypie creando nuevo recurso que tiene claves foráneas?
- 24. Creando archivos iCal en C#
- 25. creando un nuevo repositorio remoto para un proyecto existente con Mercurial
- 26. Creando un árbol de comportamiento de IA en C# - ¿Cómo?
- 27. Creando XML en C++ Código
- 28. C# DateTime siempre crea un objeto nuevo?
- 29. Creando un XmlNode/XmlElement en C# sin un XmlDocument?
- 30. Creando clases parciales en C#
Las respuestas dadas hasta ahora son todas buenas opciones. Mientras * puedes * crear un vector de punteros a tu subrango, probablemente no quieras. Si el vector original alguna vez crece hasta el punto en que tiene que volver a asignar su almacenamiento interno, todos los punteros se volverán inválidos. Especialmente cuando se trata de rangos tan pequeños, es preferible trabajar con una copia. –
Definir "se refiere a". ¿Qué debería pasar si el vector original cambia? –
Posible duplicado de [¿La mejor forma de extraer un subvector de un vector?] (Http://stackoverflow.com/questions/421573/best-way-to-extract-a-subvector-from-a-vector) – TobiMcNamobi