c++ y la stl

Buenas, he empezado hacer un programa/practica en c++ con el standart de la stl. La cosa es que nunca he trabajado con ellas y ando perdido.Así por ejemplo tengo que hacer un contructor de una clase tablero, la cual tiene la siguiente especificación:
  vector< vector<char> > _matriz;
pair<unsigned int,unsigned int> _tam;


Y la cabecera del constructor es :
    /**
      @brief Construye un tablero de tamaño par.first x par.second
      @param par par conteniendo número de filas y número de columnas para jugar
    */   
    tablero(const pair<unsigned int,unsigned int>& par);


Yo la implementación que he hecho es esta:
tablero::tablero(const pair<unsigned int,unsigned int>& par){
   _tam.first=par.first;
   _tam.second=par.second;
   unsigned int tam=_tam.first*_tam.second;
   _matriz.resize(tam);
}


Pensais que esta bien o mal? como lo puedo mejorar?

Un salu2 y gracias
Veamos, el codigo no es que esté mal, pero no hace lo que tu quieres que haga:

Si tu haces que tam sea el producto de los dos tamaños y luego redimensionas _matriz, lo que estas haciendo es redimensionar un vector de vectores con el numero total de elementos de la matriz, por ejemplo:

_tam.first = 3;
_tam.second = 4;

_matriz.resize(12);

Lo que tienes es una matriz de 12 filas x 0 columnas y cada fila contiene un vector<char>.
Lo que deberias hacer es usar el _tam.first para redimensionar _matriz, con lo que tendrías una "matriz" de 3 filas x 0 columnas, y luego acceder por ejemplo con un for a cada una de las filas, en las que tienes otro vector que puedes redimensionar con _tam.second, con lo que al final tienes tu matriz de 3x4.
Tienes razón gracias. Lo he dejado así:
_matriz.resize(_tam.first);
   for(unsigned int i=0;i<_tam.first;i++)
         _matriz[i].resize(_tam.second);

Pero creo que sería más correcto hacerlo con iteradores, pero no se como hacerlo me da un error de compilación, así lo he puesto con iteradores:
vector<int>::iterator it=_matriz.begin();
   for(it;it!=_matriz.end();it++)
         _matriz[it].resize(_tam.second);

El error que me da es monstruoso, así que supongo que la asignación es entre tipos incompatibles, pero no encuentro el fallo.

Un saludo y gracias
El problema está en que los iteradores no son índices, funcionan de forma autónoma. Lo correcto entonces sería algo así como
(*it).resize(_tam.second);
o bien
it->resize(_tam.second);
Por otro lado el bucle debería de ser algo así como
for(;it!=_matriz.end();it++)

De todas maneras, para este caso no creo que te haga ningún bien utilizar iteradores. Yo en lineas generales si no me obligan (como para acceder a depende que estructuras stl o para hacer inserciones y borrados) no los utilizo.
Estamos liados con ED eh?
jajajaja este breaking blocks nos tiene a todos la cabeza comida, yo he usado la primera forma esa con el resize y me funciona bastante bien.
flubbers escribió:Estamos liados con ED eh?
jajajaja este breaking blocks nos tiene a todos la cabeza comida, yo he usado la primera forma esa con el resize y me funciona bastante bien.


¿Que es ED? xD :) ¿ De que universidad sois?
Me suena a Estructuras de Datos XD. En la mia se llama Estructuras de Datos y de la Informacion.

@Pasteles: yo tampoco tiraría por iteradores para eso, aunque bien es verdad que yo vi c++ despues de c y estoy acostumbrado a redimensionar sin usarlos.
Bueno tengo problemas al compilar un programita de prueba que utiliza la clase que he implementado. He declarado en la parte privada de mi clase unas funciones para ayudarme ha realizar las funciones públicas, pues bien cuando intento compilar el programa de prueba me da el siguiente mensaje:
In file included from prueba.cpp:2:
tablero.h:57: error: ‘vector’ no se ha declarado
tablero.h:57: error: expected ‘,’ or ‘...’ before ‘<’ token
tablero.h:58: error: ‘vector’ no se ha declarado
tablero.h:58: error: expected ‘,’ or ‘...’ before ‘<’ token
tablero.h:59: error: ‘vector’ no se ha declarado
tablero.h:59: error: expected ‘,’ or ‘...’ before ‘<’ token
tablero.h:60: error: ‘vector’ no se ha declarado
tablero.h:60: error: expected ‘,’ or ‘...’ before ‘<’ token
tablero.h:61: error: ‘vector’ no se ha declarado
tablero.h:61: error: expected ‘,’ or ‘...’ before ‘<’ token


El prueba.cpp es simplemente un archivo donde declaro el tipo de dato que he creado llamando al constructor; he incluido también la librería.
Os pongo las líneas que me dan errores, pero es que si esta líneas no las pongo no puedo compilar la clase, y poniendolas sí:
    void ComprobarPosicion(vector<vector<char> > &m,unsigned int fila,unsigned int columna ,char c,vector<pair<unsigned int,unsigned int> > vec_par);
    void HaciaAbajo(vector<vector<char> > &m);
    bool FilaVacia(vector<vector<char> > m,unsigned int col);
    int CorrerDerecha(vector<vector<char> > m);
    bool EstaElemento(vector<pair<unsigned int,unsigned int> > vec,pair<unsigned int,unsigned int> par);

@zambombas somos de granada
Te falta un #include <vector> o un using por ahí (aunque es siempre mejor utilizar los nombres completos).

- ferdy
8 respuestas