Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Dudas STL Vector

Estas en el tema de Dudas STL Vector en el foro de C/C++ en Foros del Web. Hola compañeros. Despues de dar unas cabezadas en la pared y conseguir esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código C++: Ver original #include <iostream> #include <vector> using namespace ...
  #1 (permalink)  
Antiguo 24/11/2014, 15:46
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Sonrisa Dudas STL Vector

Hola compañeros.
Despues de dar unas cabezadas en la pared y conseguir esto:
Código C++:
Ver original
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. void foo(std::vector<int> *vptr){
  6.     std::cout << vptr[2][2] << std::endl;
  7. }
  8.  
  9.  
  10. int main (){
  11.     std::vector<std::vector<int>> biVector { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; //declaramos un vector bidimensional de 3x3 y lo inicializamos con los valores entre las llaves
  12.    
  13.     foo( &(*biVector.begin()) );
  14.    
  15.     cin.ignore();
  16.     return 0;
  17. }

No logro entender del todo que hace eso exactamente: &(*biVector.begin())
Se que retorna la direccion de la primera casilla de vector y tal. Pero por que hay que poner tantos * y & delante que me van a matar jajaja
Se los agradezco desde ya.
Si hay alguna forma mas facil de crear vectores bidimencional soy todo oidos XD.
Y si alguien sebe algun lugar donde explica el uso de los vectores entonces... XD
Gracias man
  #2 (permalink)  
Antiguo 24/11/2014, 15:57
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Dudas STL Vector

biVector.begin( ) te devuelve un iterador que apunta al primer elemento del vector. Un iterador puede considerarse a efectos como si de un puntero se tratase.

*biVector.begin( ) obtiene el elemento apuntado por el iterador, un vector de tipo <int>

&(*biVector.begin()) obtiene la referencia al elemento apuntado por el iterador.

Poner el * y el & te permite "eliminar" al iterador y quedarte únicamente con el vector apuntado por dicho iterador. Justo lo mismo que conseguirías si sustituyeses la llamada a la función por: foo( &biVector[0] );

En cuanto a los vectores bidimensionales... pues a ver, depende de los requisitos. Si el uso "en crudo" del vector bidimensional se te hace complicado quizás deberías plantearte encapsular el vector en una clase que proporcione una interfaz de acceso más clara y elegante.
  #3 (permalink)  
Antiguo 24/11/2014, 16:21
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dudas STL Vector

Bueno... Lo que pasa es que me estoy aprendiendo. Soy medio de a pie.
Por eso pregunte sobre alguna pagina o recurso para poder leer sobre el tema.
Pero me quedo con la copla =): &(*biVector.begin()) == &biVector[0]
XDD
Gracias maestro. Y buenas noches!
  #4 (permalink)  
Antiguo 24/11/2014, 19:25
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Dudas STL Vector

Un vector es un contenedor con una característica particular: sus elementos ocupan posiciones sucesivas en memoria. Es por eso que el engendro mutante ese funciona.

void foo(std::vector<int> *vptr);
dice que foo es una función que toma un puntero a un vector de int;
luego
vptr[2][2]
es posible porque en realidad ese puntero es la dirección donde comienza el vector bidimensional a la que se le suman las 6 posiciones de los primeros dos vectores de enteros, y luego dos más.

Una expresión equivalente sería:
(*vptr)[0]+8

Pero seguramente nadie que no esté jugando a las adivinanzas pondría semejante basura en código real.

Vas a encontrar una buena referencia sobre vectores (y en general, sobre la biblioteca estándar del C++) en:
http://www.cplusplus.com/reference/vector/vector/

:lareto :)
  #5 (permalink)  
Antiguo 25/11/2014, 05:18
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Dudas STL Vector

Cita:
Iniciado por lareto Ver Mensaje
Un vector es un contenedor con una característica particular: sus elementos ocupan posiciones sucesivas en memoria. Es por eso que el engendro mutante ese funciona.

void foo(std::vector<int> *vptr);
dice que foo es una función que toma un puntero a un vector de int;
luego
vptr[2][2]
es posible porque en realidad ese puntero es la dirección donde comienza el vector bidimensional a la que se le suman las 6 posiciones de los primeros dos vectores de enteros, y luego dos más.

Una expresión equivalente sería:
(*vptr)[0]+8

Pero seguramente nadie que no esté jugando a las adivinanzas pondría semejante basura en código real.

Vas a encontrar una buena referencia sobre vectores (y en general, sobre la biblioteca estándar del C++) en:
http://www.cplusplus.com/reference/vector/vector/

:lareto :)
Gracias! Estoy leyendo todo lo que sea sobre vectores.
Esa página la utiliso mucho. Tambien stackoverflow que tienen muy buenos consejos y truquillos XDD

Etiquetas: dudas, int, stl, vector
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:39.