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

Duda uso libreria <vector>

Estas en el tema de Duda uso libreria <vector> en el foro de C/C++ en Foros del Web. Hola, Estoy haciendo un programa sencillo para habituarme al uso de la libreria <vector> pero no se muy bien como usarla. El programa es simple. ...
  #1 (permalink)  
Antiguo 15/12/2012, 17:48
 
Fecha de Ingreso: diciembre-2012
Mensajes: 11
Antigüedad: 11 años, 4 meses
Puntos: 0
Duda uso libreria <vector>

Hola,

Estoy haciendo un programa sencillo para habituarme al uso de la libreria <vector> pero no se muy bien como usarla.

El programa es simple. Lo único que hace es leer datos. Me gustaria saber como almacenarlos en el vector.

el vector creado es el siguiente


vector <string> humano;

Y la parte del programa donde quiero meterlo es aqui:

Código:
cout << "Cuantos humanos va a introducir: " << endl;
cin >> n;

                    for (int i=0; i<n; i++)
                    {
cout << "Escriba el nombre";
cin >> nombre;
                    }
  #2 (permalink)  
Antiguo 15/12/2012, 19:14
Avatar de dontexplain  
Fecha de Ingreso: junio-2012
Mensajes: 536
Antigüedad: 11 años, 10 meses
Puntos: 127
Respuesta: Duda uso libreria <vector>

Lo primero es que cin y cout iteran sobre string de chars o char ascii por lo que para unicode tendrás que usar wcout y wcin.

Por otro lado, en tu caso, puedes crear un vector vacío instanciando

vector <string> humano;

Y luego añadiendo elementos al final del vector

humano.push_back(string);

Para acceder a estos elementos, al igual que un array en cualquier otro lenguaje como php, python o javascript, usa índices

humano[0]

Para acceder al último elemento no se puede dereferenciar el último iterador mediante *(humano.cend()) por lo que calculas el tamaño total del vector restándole uno

humano[humano.size()-1]

o también usando

humano.back()

El resto de funciones puedes leerlas en http://www.cplusplus.com/reference/vector/vector/

Un saludo.
__________________
21añero.
HTML/CSS, PHP, JS/jQuery, Mysql; NodeJS/Socket.io (& V8); C++ ; Python (wxpy); Ensamblador.
Músico (clarinetista/pianista) y compositor

Última edición por dontexplain; 15/12/2012 a las 19:36
  #3 (permalink)  
Antiguo 16/12/2012, 11:04
 
Fecha de Ingreso: diciembre-2012
Mensajes: 11
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda uso libreria <vector>

Y en el caso de que quisiese meter diferentes datos correspondientes a algo en el vector.

Me explico, la idea sería meter la edad y el nombre de diferentes personas de tal manera que al mostrarlas las mostrara por orden. ¿Eso como lo podría hacer?
  #4 (permalink)  
Antiguo 16/12/2012, 12:53
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: Duda uso libreria <vector>

Cita:
Iniciado por fernandez6 Ver Mensaje
Y en el caso de que quisiese meter diferentes datos correspondientes a algo en el vector.

Me explico, la idea sería meter la edad y el nombre de diferentes personas de tal manera que al mostrarlas las mostrara por orden. ¿Eso como lo podría hacer?
Solo puedes meter el mismo tipo de dato dentro de un vector. Es decir, un vector de enteros, un vector de char, un vector de double... pero no una mezcla.

Para solucionar tu problema se pueden hacer varias cosas, por ejemplo:
Busca la clase string en el enlace de C++ que te ha pasado @dontexplain. Funciona muy parecido al vector. Ahora haces un vector de string, tal que así:
Código:
vector<string> nombres;
y vas introduciendo (con push_back() ) cada nombre en cada posición (por ejemplo nombres[0]="Jaimito"; nombres[1]="Pepito"...).
Ahora haces un vector de enteros:
Código:
vector<int> edad;
y haces que la posición de la edad sea la misma que la que tiene la persona en el vector nombres. Es decir, si Jaimito está en nombres[0], en edad[0] tiene que estar su edad; si Pepito está en nombres[1], su edad se encontrará en edad[1].

Un saludo.
  #5 (permalink)  
Antiguo 17/12/2012, 11:40
 
Fecha de Ingreso: diciembre-2012
Mensajes: 11
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda uso libreria <vector>

Lo he estado intentado pero no he sido capaz de implementar el vector de manera correcta. Os dejo lo que tengo escrito a ver si me podeis ayudar. Está escrito de manera que coja los datos pero mi objetivo es en un futuro poder almacenar más datos a continuacion de los que ya tengo (utilizando push_back)

Este es el main

Código:
#include <iostream>
#include <string>
#include <profesor.h>
#include <vector>

using namespace std;

int main ()

{
    profesor profesores;
    int eleccion;

            start:
            cout << "1. Introducir nuevos profesores"  << endl;
            cout << "2. Mostrar todos los profesores"  << endl;
            cout << "3. Volver al menu inicial" << endl;
            cout << "" << endl;
            cin >> eleccion;
            cout << "**************************" << endl;

            switch (eleccion)
            {
            case 1 :

                {
                    cout << endl;
                    profesores.crear_profesor();
                    cout << endl;
                }
                    break;

             case 2:


                {
                    cout << endl;
                    profesores.mostrar_profesor();
                    cout << endl;
                }

                break;

              case 3: goto start;

           }
}
Y este es el profesor.h

Código:
#ifndef PROFESOR_H
#define PROFESOR_H

#include <iostream>
#include <string>

using namespace std;

class profesor
{
protected:
    char nombre[20];
    int edad;
    int telefono;
    int n;

public:


    void crear_profesor ()



    {

        cout << "Cuantos profesores va a introducir: " << endl;
        cin >> n;


        for (int i=0; i<n; i++)

    {
        cout << "Nuevo profesor: " << endl;
        cout << "Introduzca el nombre: ";
        cin >>  nombre;
        cout << "Introduzca la edad: ";
        cin >> edad;
        cout << "Introduzca el telefono: ";
        cin >> telefono;
        cout << "" << endl;

        }
    }
    void mostrar_profesor (void)

    {

        for (int i=0; i<n; i++)
    {
        cout << "Datos del profesor " << i+1 << endl;
        cout << "Nombre: " << nombre << endl;
        cout << "Telefono: " << telefono << endl;
        cout << "Edad: " << edad << endl;


        }

    }
Muchas gracias a todos por la ayuda
  #6 (permalink)  
Antiguo 17/12/2012, 14:49
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: Duda uso libreria <vector>

Al ver el código me he perdido:
¿De qué quieres hacer el vector? Por que puedes hacerlo de profesores. Lo tendrías que hacer fuera de la clase profesor y así:

Código:
vector<profesor> mis profesores;
Entonces tu irías creando profesores así:

Código:
Profesor profe1, profe2, profe3;
Mediante métodos modificadores (son funciones dentro de la clase para modificar desde fuera las variables de instancia de la clase) o mediante el uso de constructores (busca sobre ellos en Google) le darías valor a las distintas variables de los profesores. Después llegarías y harías algo así:
Código:
misprofesores.push_back(profe1);
misprofesores.push_back(profe2);
misprofesores.push_back(profe3);
Y se irían añadiendo los profesores al vector.

Por cierto, estaría bien que cambiaras lo de "goto" por un bucle (tipo while, por ejemplo), ya que eso no es programación estructurada.
Un saludo.
  #7 (permalink)  
Antiguo 17/12/2012, 17:40
 
Fecha de Ingreso: diciembre-2012
Mensajes: 11
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda uso libreria <vector>

Mi objetivo es a través de la clase profesor que se introduzcan los datos pero luego sacarlos a través de un vector para poder manipularlo en otras clases (por ejemplo otra clase para adjudicar a cada profesor una cierta cantidad de alumnos siendo alumnos otra clase). Almacenar los datos en el profesor.h así:
Código:
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class profesor
{

protected:

    string nombre;
    int edad;
    int telefono;
    int n;
    vector <string> nombreprofe;
    vector <int> edadprofe;
    vector <int> telefonoprofe;
    vector <int> dimension;
    int d;


public:

 void crear_profesor()

{



    cout << "Cuantos profesores va a introducir: " << endl;
    cin >> n;


    for (int i=0; i<n; i++)

{
    cout << "Nuevo profesor: " << endl;
    cout << "Introduzca el nombre: ";
    cin >>  nombre;
    nombreprofe.push_back(nombre);
    cout << "Introduzca la edad: ";
    cin >> edad;
    edadprofe.push_back(edad);
    cout << "Introduzca el telefono: ";
    cin >> telefono;
    telefonoprofe.push_back(telefono);
    cout << "" << endl;


    }
}


void mostrar_profesor(void)

{
    d = nombreprofe.size();
    for (int i=0; i<d; i++)
{
    cout << "Datos del profesor " << i+1 << endl;
    cout << "Nombre: " << nombreprofe.at(i) << endl;
    cout << "Telefono: " << telefonoprofe.at(i) << endl;
    cout << "Edad: " << edadprofe.at(i) << endl;


 }

}



};
Entonces ahora mi objetivo sería que todos estos datos almacenados para cada profesor poder sacarlos fuera de esta clase hacía el main o hacia otra clase para poder seguir usándolo.
  #8 (permalink)  
Antiguo 17/12/2012, 18:15
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: Duda uso libreria <vector>

El problema viene de concepto.
¿Qué hace la clase vector? Cosas similares a un array (no me matéis, es para explicar unas cosas).
¿Qué hace un array? En plan bestia, podríamos decir que coge un puñado de datos que son del mismo tipo y los pone uno tras otro en memoria de forma que podamos acceder a ellos como si fueran variables normales o usarlas como una cadena de datos.

¿Qué es una clase? Con la ayuda de tipos básicos, creamos un nuevo tipo de dato.

Teniendo lo anterior en cuenta:
Profesor es una clase. Tu crearás objetos de la clase profesor. Cada uno tendrá los atributos que has puesto (nombre, edad, telefono...). Los atributos son el mismo tipo de dato, pero cada profesor será independiente uno de otro ya que el estado de cada profesor, es decir, el valor de sus variables de instancia, será distinto.

Pensemos por un momento: ¿cómo declaramos cada una se esas variables? Analicemos qué es cada una de las variables:
nombre: podría ser un string, por que es un tipo de dato adecuado para ello.
telefono: es un numero entero (un int)
edad: otro número entero (int)

¿Para alguno de esos nos hacía falta un vector? NO. ¿Cuántos nombres, teléfonos o edades va a tener un profesor? Solo una. La clase vector se utiliza, como los array, cuando tenemos más de un elemento de un tipo.
Quieres añadir que cada profesor tenga un conjunto de alumnos asignados. ¿Alumnos es un conjunto, es decir, son más de uno? Sí. Por tanto, usa la clase vector, añadiendo una nueva variable a tu clase Profesor. Quedaría entonces así:
Código C++:
Ver original
  1. class profesor{
  2.  
  3. protected:
  4.  
  5.     string nombre;
  6.     int edad;
  7.     int telefono;
  8.     vector <Alumno> misalumnos;
  9. }

Ahora, haz métodos modificadores y consultores. Esos métodos permitirán que, por ejemplo desde el main, se pueda acceder a las variables de instancia, para cambiarlas o consultarlas.

Saca el método crear_profesor de la clase (ponlo en un archivo que no tenga que ver con la clase) y haz que te genere un profesor y lo añada al vector y así.
Haré como que has implementado los métodos consultores y los llamaré setNOMBREVARIABLE.

Código C++:
Ver original
  1. void crear_profesor(vector<Profesor> & profesores){  
  2.     int n, telefono, edad;
  3.     Profesor profe;
  4.     string nombre;
  5.     cout << "Cuantos profesores va a introducir: " << endl;
  6.     cin >> n;
  7.  
  8.  
  9.     for (int i=0; i<n; i++)
  10.  
  11. {
  12.     cout << "Nuevo profesor: " << endl;
  13.     cout << "Introduzca el nombre: ";
  14.     cin.getline (nombre,300);//Para string se usa esto
  15.     profe.setnombre(nombre);
  16.     cout << "Introduzca la edad: ";
  17.     cin >> edad;
  18.     profe.setedad(edad):
  19.     cout << "Introduzca el telefono: ";
  20.     cin >> telefono;
  21.     profe.settelefono(telefono);
  22.     cout << "" << endl;
  23.     profesores.push_back(profe);
  24.     }
  25. }
Y los alumnos se los añades siguiendo un esquema parecido. En el método modificador, si haces por ejemplo setalumno(alumno), tendrás que añadirlo así:
Código:
misalumnos.push_back(alumno);
Ahora, en tu main, por ejemplo, para mostrar los profesores por orden e ir viendo sus atributos haces algo así (tomaré como que has hecho los métodos consultores con nombre getNOMBREVARIABLE):
Código C++:
Ver original
  1. for(int i=0; i<misprofesores.size();i++){
  2.    cout<< "Profesor "<<misprofesores[i].getnombre()<<" con edad "<<misprofesores[i].getedad()<<  y telefono "<<misprofesores[i].gettelefono()<<endl;
  3. }

Mírate bien lo que es un vector y los métodos que tiene (las funciones que puedes usar con él). Mira también ejemplos de uso, que los hay por Internet a patadas.

Probablemente haya errores en el código, pero aproximadamente es eso.

Un saludo.
  #9 (permalink)  
Antiguo 21/12/2012, 08:50
vib
 
Fecha de Ingreso: marzo-2011
Mensajes: 43
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Duda uso libreria <vector>

Hola buenas!
Tengo un pequeño problema con el uso de vectores y viendo este post que tienen una pequeña relacion he decidio reutilizarlo :D
Os comento, bueno primero os enseño el codigo:
Código:
bool juego::existe_imagen(char *path)
{
    vector<imagen>::iterator it;
    char *p;
    for (it = sprite.begin(); it != sprite.end();  ++it)
        if(it.getruta()==path) return true;
    
    return false;
    
}
path es un *char con una ruta "/pedo.bmp" etc..
utilizo un iterator para comparar mi vector de sprites y quiero ver su path coincide con alguna ruta que hay en sprite
para posteriormente colocar la nueva imagen en sprite o reutilizar una que ya este puesta.
El caso esque
Código:
 if(it.getruta()==path) return true;
Me da error, pero tambien me lo da imprimir directamente haciendo
cout<<it.getruta();
tambien me da error hacer
char *p;
p=it.getruta();

El error que me da es este:
juego.cpp|30|error: ‘class __gnu_cxx::__normal_iterator<imagen*, std::vector<imagen, std::allocator<imagen> > >’ has no member named ‘getruta’|

Gracias :D

PD: el metodo de get ruta es este
Código:
char *ruta;

char *imagen::getruta()
{
    return ruta;
}
  #10 (permalink)  
Antiguo 21/12/2012, 17:55
Avatar de iblancasa  
Fecha de Ingreso: diciembre-2012
Ubicación: España
Mensajes: 143
Antigüedad: 11 años, 4 meses
Puntos: 16
Respuesta: Duda uso libreria <vector>

El problema no es la clase vector, es
Código C++:
Ver original
  1. if((*it).getruta()==path) return true;
Hay que ponerle asterisco. Con eso debe funcionar.
Un saludo y, por favor, no desvíes temas.

Etiquetas: int, libreria, programa, string
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 13:56.