Dev - C++ - Consulta sobre declaración de vectores

   
Vista:

Consulta sobre declaración de vectores

Publicado por Jose Manuel (30 intervenciones) el 22/11/2014 20:48:03
Tengo una pregunta que igual es tontería, o quizás no lo sea, y que también es aplicable a cualquier otra matriz de 2 o mas dimensiones.

Supongamos que declaro una matriz, o vector de dos dimensiones, tal que:

1
2
3
4
5
6
int main(){
vector <vector<int> > Agrupado;
int prueba[5][5];
Agrupado[0][0] = -1;
prueba[0][0] = -1;
}

Nada que objetar, funciona perfectamente.

Un array de enteros (por ejemplo) puede ser declarado directamente

1
int Prueba[5] = {1, 2, 3, 4, 5};

Un vector no puede ser inicializado de esa forma (o al menos eso creo).

¿Existe alguna forma simple de inicializar un vector de una o mas dimensiones directamente con los valores?

Claro, obviamente puedo hacer un "apaño" metiendo en un array los valores y luego metiendolos con una función dentro del vector, pero me pregunto si existe algún atajo para conseguir lo mismo de otra forma
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de vangodp

Consulta sobre declaración de vectores

Publicado por vangodp (287 intervenciones) el 23/11/2014 03:57:27
int Prueba[3][5] = { {1,2,3,4,5} , {6,7,8,9,10} , {11,12,13,14,15} };

??Es esto??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sobre declaración de vectores

Publicado por Jose Manuel (30 intervenciones) el 23/11/2014 11:55:38
Mm no, eso es para rellenar un array que he declarado, yo quería hacerlo con un vector.

No obstante, me han confirmado por otro lado, que al menos en C++98 no es posible, la normativa C++11 aparentemente si que lo contempla como constructor, pero como uso el compilador GNU y este tiene la normativa C++11 en estado experimental (por lo que se) me temo que tendré que apañarme una función que coja un array declarado como me indicas (que eso está claro) y asigne los mismos valores a un vector.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Consulta sobre declaración de vectores

Publicado por vangodp (287 intervenciones) el 23/11/2014 19:04:51
Esto? XDDD

std::vector< vector<int> > v ( 2, vector<int> (3) );
v = {
{1,2,3},
{4,5,6},
{7,8,9}
};

cout << v[1][2];
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sobre declaración de vectores

Publicado por Jose Manuel (30 intervenciones) el 24/11/2014 15:26:46
Es posible, pero me da errores y avisos... no obstante he encontrado un método alternativo para hacerlo, al menos en una dimensión, pero sigo teniendo problemas en dos

1
2
3
4
string S_Uno[] = {"Uno", "Dos", "Tres"};
    string S_Dos[] = {"Cuatro", "Cinco", "Seis"};
    vector<string> Uno(S_Uno, S_Uno +sizeof(S_Uno) / sizeof(string));
    vector<string> Dos(S_Dos, S_Dos +sizeof(S_Dos) / sizeof(string));

Es un poco de esa manera, pero funciona

Al intentar hacerlo como me comentas, me dice:

1
2
3
4
5
6
7
8
D:\C++\Estructuras de datos\07 Vectores\Anexa.cpp|13|warning: extended initializer lists only available with -std=c++11 or -std=gnu++11 [enabled by default]|
 
D:\C++\Estructuras de datos\07 Vectores\Anexa.cpp|13|error: no match for 'operator=' in 'v = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}'|
 
D:\C++\Estructuras de datos\07 Vectores\Anexa.cpp|13|note: candidate is:|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|161|note: std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = std::vector<int>; _Alloc = std::allocator<std::vector<int> >]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\bits\vector.tcc|161|note:   no known conversion for argument 1 from '<brace-enclosed initializer list>' to 'const std::vector<std::vector<int> >&'|
||=== Build falló: 1 error(s), 4 warning(s) (0 minute(s), 0 second(s)) ===|

EL tema de vectores de 2 dimensiones me está dando muchos dolores de cabeza, supongo que hasta que "acierte" a entender exactamente como funcionan, en teoría no debería de tener tantos problemas, pero me temo que la teoría en este caso es cabezona.

Por cierto, si la matriz es de 3x3... ¿no debería ser...

std::vector< vector<int> > v ( 3, vector<int> (3) ); ?

Te adelanto que sigue "cascando"

No obstante, el tema de al menos vectores de una dimensión lo tengo solucionado creando un string y metiendolo con el constructor, es el tema de 2 dimensiones el que me está dando dolores de cabeza
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Consulta sobre declaración de vectores

Publicado por vangodp (287 intervenciones) el 24/11/2014 17:34:07
y por que no activas c++11?
Eso todo que te pase se recomienda en stackorverflow, no creo que sean mala las practicas.
Y ademas a mi no me tira ningun error. Pero claro... Tengo C++11 activado XD.
Como bien te dice el aviso: available with -std=c++11 or -std=gnu++11
Yo lo tengo activado y no noto ninguna diferencia con relacion a lo antiguo. Solo que tiene mas cosas XD
Si no usamos lo ultimo, entonces vayamos todos al C de los 70 XD
Suerte!

PD:
Sobre lo del 2x3 si es correcto. Lo puse mal.
Mira... Yo uso codeblocks con el compilador mingw-64 que me bajo aparte.
uso el anterior dicho con c++11 por que puedo usar thread, cosa que hasta hace poco no traia la ultima version del compilador que venia por defecto en codeblocks. Me parece que ese problema ya se solvento o es pura especulacion ya que no lo probe aun. =)
Espero que encuentres lo que buscas. Si encuentras algo pon la solucion aqui, yo hare lo mismo ;)
Hasta luego y mucha suerte.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sobre declaración de vectores

Publicado por Jose Manuel (30 intervenciones) el 24/11/2014 19:45:08
Dios mio de mi alma y de mi corazón que decía una amiga mía... la madre que me parió

Ha sido habilitar el C++11 y voila... se acabó el problema

Voy a mirar lo del compilador ese a ver si me apaño, ¡ gracias mil !
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sobre declaración de vectores

Publicado por Jose Manuel (30 intervenciones) el 24/11/2014 21:58:26
Mi gozo en un poco... si, pero no.

Verás, ahora tengo un problema mas raro, incluso con C++11

Aparentemente, el problema lo tengo al manejar ese vector (cualquiera que haga en 2 dimensiones) al pasarlo a una función por referencia... en el momento en que se me ocurra consultar cualquier propiedad del vector, tengo todas las papeletas para que explote

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <vector>
using namespace std;
 
 
vector<int> aplana(const vector< vector<int> >& v , int filas){
       vector<int> Salida;
       for (int i=0; i<filas; i++){
        cout << v[i].size();
       }
}
 
 
int main(){
    vector< vector<int> > v ( 3, vector<int> (4) );
    v = {
    {1,2,3},
    {4,5},
    {6,7,8,9}
    };
    int filas = v.size();
    cout << filas << endl;
    //aplana(v, 3);
    for (int i=0; i<filas; i++){
        cout << v[i].size() << endl;
       }
}

Declaro el vector como me indicastes... estupendo, funciona
Lo relleno con una lista de elementos... sin problema

Luego mi intención es trabajar con el en una función. Obviamente lo primero que debería de hacer una función de este tipo es averiguar de cuantos elementos se compone el vector, usando el método .size()

Si consulto el número de filas en el cuerpo del programa, no me da problemas. Si consulto el numero de columnas en cada fila en el cuerpo del main... funciona.

Si intento exactamente lo mismo en una función, agarrate que esto explota

Empiezo a sospechar que esto solo funciona usando punteros o algo por el estilo, y en ese tema aún estoy muy verde, pero teoricamente esto debería de poder hacerlo, a menos que este cursillo esté maldito y me esté tomando el pelo en algunos de los ejercicios y para manejar esto haga falta otra herramienta
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Consulta sobre declaración de vectores

Publicado por vangodp (287 intervenciones) el 24/11/2014 22:44:27
bueno...
pasando vector a bajo nivel.... XDD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
using namespace std;
 
void foo(std::vector<int> *vptr){
    std::cout << vptr[2][2] << std::endl;
}
 
 
int main (){
    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
 
    foo( &(*biVector.begin()) );
 
    cin.ignore();
    return 0;
}
mi cabeza va explotar jajaja
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Consulta sobre declaración de vectores

Publicado por vangodp (287 intervenciones) el 24/11/2014 23:36:34
Me ha dicho un compañero que es una ninja... que se puede hacer eso sin mas: foo( &biVector[0] ); que a efectos es lo mismo que eso: foo( &(*biVector.begin()) );

Sus palabras exactas son:

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] );

fuente: http://www.forosdelweb.com/f96/dudas-stl-vector-1114540/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Consulta sobre declaración de vectores

Publicado por Jose Manuel (30 intervenciones) el 25/11/2014 10:12:31
Vale... no te rías... o riete, que en el fondo yo también me estoy riendo.

Aún no he probado el tema de los punteros, pero he bajado e instalado el compilador que me recomendaste, el mingw-64.

Sin pararme con contemplaciones, meto el código a saco asumiendo que el paso por referencia está bien hecho. Compilo y no me da errores, y me digo "virgencita que me quede como estoy"... le doy a ejecutar y...

FUNCIONA

Donde el compilador GNU falla y me convierte el ejecutable en el equivalente de una exibición pirotécnica, el mingw-64 ni se inmuta y me presenta el resultado sin pestañear.

Queda desde este momento este compilador puesto como "por defecto" y arreando, y lo siento por los que se estampen con problemas similares por esto, pero yo si un compilador me funciona, y el otro no, no tengo que pensarme mucho las opciones.

Gracias de nuevo por las sugerencias, y sobre todo por el compilador
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de vangodp

Consulta sobre declaración de vectores

Publicado por vangodp (287 intervenciones) el 25/11/2014 13:31:43
mira... buenos compiladores son el TDM GCC y el mingw-w64. No es el de mingw 64 el que te lo dije. Si no que notese el w delante de la 64. Aun que me alegro que te haya funcionado.
Todo se basa en las versiones de mingw, la version con mingw-w64 que utiliso yo ahora mismo aun no sale con codeblocks por defecto.
El mingw-w64 que uso yo es la 4.9.1 mientras que codeblocks viene por defecto el 4.8.1. y es la TDM. Por que el mingw normal aun esta en la 4.7.1., es el que viene con codeblocks.
El mingw-w64 que te digo lo puedes bajar de aqui: http://sourceforge.net/projects/mingw-w64/
Es un instalador que te permite escojer unas cuantas opciones. Es muy bueno!, No pierda la direccion.
Al momento de escribir esto la version es la 4.9.2 la ultima que me sale para descargar. Como bien ves va muy por delante de las demas. No conozco nada mejor XDDD
Por eso te digo que codeblocks y mingw-w64 es la caña XDD
Puedes descargar la ultima version de codeblocks con el compilador que mas te guste o limpio sin compilador, y aparte poner el mingw-w64, luego despues configurar el toolchain para que puedas usar varios compiladores segun el caso. Eso es lo bueno que tiene codeblocks. =)
Suerte ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar