Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: #Aitor en 26 Marzo 2014, 03:46 am



Título: Problemas con arrays C++
Publicado por: #Aitor en 26 Marzo 2014, 03:46 am
Hola buenas.

Ando probando los arrays en C++, y vengo muy acostumbrado de PHP. Tengo el siguiente problema, según C++ para hacer arrays se utiliza la siguiente sintaxis.

(http://fotos.subefotos.com/59a616d7b98471f472fcab41744ed4e4o.png)

Código
  1. Type name[long] = {... , ... , ...};

En el caso del ejemplo de la tabla anterior.
Código
  1. String foo[4]{ "Aitor", "Lluvia", "Luna", "Azul" };

A dónde quiero llegar es si lo siguiente retornaría falso.

Código
  1. if ( foo[5] == false){ cout << "Retorna false"; }

Pero da errores de compilación. Suponiendo que no retornase un valor False... ¿Cómo cerrarías el siguiente bucle?

Código
  1. int main()
  2. {
  3.    string foo[4] = {"Aitor", "Lluvia", "Luna", "Azul"};
  4.    int x = 0;
  5.  
  6.        while(...){
  7.        cout  << foo[x] << endl;
  8.        x++;
  9.  
  10.    }
  11. }

Podría usarse

Código
  1. while(x < 4){

Pero es muy forzado y no es "automatizado" dado que doy por hecho que sé cuanto es la longitud del array.

Un saludo y gracias.


Título: Re: Problemas con arrays C++
Publicado por: rir3760 en 26 Marzo 2014, 04:23 am
Para calcular el numero de elementos de un array puedes utilizar, siguiendo tu ejemplo:
Código
  1. #include <iostream>
  2. using std::cin;
  3. using std::cout;
  4. using std::endl;
  5.  
  6. #include <string>
  7. using std::string;
  8.  
  9. int main()
  10. {
  11.   string foo[4] = {
  12.      "Aitor",
  13.      "Lluvia",
  14.      "Luna",
  15.      "Azul"
  16.   };
  17.   size_t num_elem = sizeof foo / sizeof foo[0];
  18.  
  19.   for (size_t i = 0; i < num_elem; i++)
  20.      cout  << foo[i] << endl;
  21.  
  22.   return 0;
  23. }
Sin embargo es un idioma de C, si estas aprendiendo C++ mejor utiliza la clase vector.

Bajo el nuevo estándar C++11 la declaración de un vector es similar a la de un array y al utilizar "auto" nos olvidamos de indicar el tipo de la variable en el único bucle del programa:
Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <string>
  6. using std::string;
  7.  
  8. #include <vector>
  9. using std::vector;
  10.  
  11. int main()
  12. {
  13.   vector<string> foo = {
  14.      "Aitor",
  15.      "Lluvia",
  16.      "Luna",
  17.      "Azul"
  18.   };
  19.  
  20.   for (auto i = 0; i != foo.size(); ++i)
  21.      cout  << foo[i] << endl;
  22.  
  23.   return 0;
  24. }

Si el programa se compila bajo el estándar anterior C++98 los elementos del array se deben agregar manualmente y se debe indicar el tipo de la variable (este es vector<string>::size_type).

Un saludo


Título: Re: Problemas con arrays C++
Publicado por: eferion en 26 Marzo 2014, 08:09 am
Bajo el nuevo estándar C++11 la declaración de un vector es similar a la de un array y al utilizar "auto" nos olvidamos de indicar el tipo de la variable en el único bucle del programa.

En C++11 también se puede simplificar el bucle:

Código
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <string>
  6. using std::string;
  7.  
  8. #include <vector>
  9. using std::vector;
  10.  
  11. int main()
  12. {
  13.   vector<string> foo = {
  14.      "Aitor",
  15.      "Lluvia",
  16.      "Luna",
  17.      "Azul"
  18.   };
  19.  
  20.   for ( auto str : foo )
  21.      cout  << str << endl;
  22.  
  23.   return 0;
  24. }


Título: Re: Problemas con arrays C++
Publicado por: amchacon en 26 Marzo 2014, 10:48 am
Ni "forzado" ni "automatico", en C no habia ningun sistema para controlar que no adcedieras a posiciones erroneas. Ahi trabajas sabiendo la longitud del array (salvo en el caso de cadenas, que se ponia un cero en el ultimo elemento para acabar).

Bueno ni en C++ hay un sistema. Las razones de esto son puramente por eficiencia, es un desperdicio de recursos ir comprobando si adcedes a una posicion erronea cada vez. De modo que si lo haces, no da error de compilacion y sus consecuencias son indeterminadas (puede que modifiques a otras variables, puede que te de un error de ejecución...).

Los compañeros de arriba te han respondido usando la clase vector. Una objeto que contiene un array que puedes redimensionarlo a tu gusto, ese objeto ademas tiene control sobre su tamaño y podemos consultarlo con el metodo size().

Realmente a la hora de controlarlo no hay mucha diferencia: Su tamaño. Si adcedemos a posiciones invalidas dara error de ejecucion.


Título: Re: Problemas con arrays C++
Publicado por: Yoel Alejandro en 26 Marzo 2014, 15:35 pm
Si el autor del post viene de programar PHP sería mucho mejor atenerse a las clases de alto nivel de C++ (sencillas y potentes), que programar en el "rudimentario" (pero elemental y eficiente) nivel de C. ¿no?

Para programar en C, y sobre todo con arrays y cadenas, debes tener muy en cuenta aspectos de hardware para elaborar código eficiente. Mientras las clases de C++ abstraen la capa de hardware, manteniendo al programador en un nivel como "virtual" diría yo, independiente casi por completo de los aspectos máquina.

Lo mejor sería la clase vector sobre el tipo string, es lo que más se parece a la manera de trabajar PHP, javascript, Java y similares.