elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Datos por claves
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Datos por claves  (Leído 2,298 veces)
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Datos por claves
« en: 27 Junio 2014, 06:34 am »

Hola como estan.

Mi siquiente duda es, puede usar alguna clave para acceder a un dato.

por ejemplo asi

Código
  1. //tipo mi_diccionario = ['clave_1': valor_1, 'clave_2': valor_2, 'clave_7': valor_7]
  2.  
  3. //Ejemplo
  4. //cout << mi_diccionario['clave_2'] // Salida: valor_2
  5.  

Que nesecito aprender se que me diran vectores o arreglos pero hay otra forma y si no la hay me podrian dar algun ejemplo de como usar los vectores en algo asi.

saludos y muchas gracias.


En línea

Lo que se puede imaginar... se puede programar.
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Datos por claves
« Respuesta #1 en: 27 Junio 2014, 06:59 am »

si se puede, pero tienes que crear la estructura para ello... aquí me fusilo este ejemplo
Código
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. template <class T>
  6. class AssocArray {
  7. private:
  8.  
  9.    typedef struct _Data {
  10.        T data;
  11.        string name;
  12.    } Data;
  13.    vector<Data> stack;
  14. public:
  15.  
  16.    long Size() {
  17.        return stack.size();
  18.    }
  19.  
  20.    bool IsItem(string name) {
  21.        for (int i = 0; i < Size(); i++) {
  22.            if (stack[i].name == name)
  23.                return true;
  24.        }
  25.        return false;
  26.    }
  27.  
  28.    bool AddItem(string name, T data) {
  29.        if (IsItem(name))
  30.            return false;
  31.        Data d;
  32.        d.name = name;
  33.        d.data = data;
  34.        stack.push_back(d);
  35.        return true;
  36.    }
  37.  
  38.    T& operator[](string name) {
  39.        for (int i = 0; i < Size(); i++) {
  40.            if (stack[i].name == name)
  41.                return stack[i].data;
  42.        }
  43.        long idx = Size();
  44.        Data d;
  45.        d.name = name;
  46.        stack.push_back(d);
  47.        return stack[idx].data;
  48.    }
  49.  
  50.    string GetItemName(long index) {
  51.        if (index < 0)
  52.            index = 0;
  53.        for (int i = 0; i < Size(); i++)
  54.            if (i == index)
  55.                return stack[i].name;
  56.        return "";
  57.    }
  58.  
  59.    T& operator[](long index) {
  60.        if (index < 0)
  61.            index = 0;
  62.        for (int i = 0; i < Size(); i++) {
  63.            if (i == index)
  64.                return stack[i].data;
  65.        }
  66.        return stack[0].data;
  67.    }
  68.  
  69. };

y aquí el ejemplo de uso

Código
  1. // Declare the class to be used with int data type
  2. AssocArray<int> arr;
  3.  
  4. // Now add an element to the array using function
  5. arr.AddItem("firstElement", 100);
  6.  
  7. // Now add an element using [] operator
  8. arr["secondElement"] = 25;
  9.  
  10. // Now add another element
  11. arr["otherElement"] = 56;
  12.  
  13. // Here is how to access the element "firstElement" for any other purpose
  14. cout << "firstElement = " << arr["firstElement"] << endl;
  15.  
  16. // Here is how to access using index
  17. cout << "Element 1= " << arr[1] << endl;
  18.  
  19.  
  20. // Other functions
  21. // arr.IsItem("some element name") will return true if that item is on the array list or else false
  22. // arr.GetItemName(2) will return the name of the element corresponding to index 2
  23. // arr.Size() will return the number of items saved on the list
  24.  


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Datos por claves
« Respuesta #2 en: 27 Junio 2014, 07:24 am »

Hola gracias por responder.


Código
  1. arr.AddItem("firstElement", 100);
  2.  
  3. cout << "firstElement = " << arr["firstElement"] << endl;
  4.  
  5. cout << "Element 1= " << arr[1] << endl;
  6.  

tomando estas partes de codigo:

En el primer cout la cadena firstElement que contiene ese arrgleglo deberia de imprimirme 100 o 100 es la posicion en el arreglo de esa cadena y cual es la clave que se usa para acceder a ese elemento firstElement?


en el segundo cout arr[1] esta accediendo por el indice pero 1 sera la clave para acceder a ese elemento?

me disculpo si no entendi muy bien el ejemplo sigo analizandolo.

Gracias saludos.
En línea

Lo que se puede imaginar... se puede programar.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Datos por claves
« Respuesta #3 en: 27 Junio 2014, 09:38 am »

Si necesitas que los elementos se almacenen en orden, puedes usar std::pair y un vector:

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. int main( )
  6. {
  7.  std::vector< std::pair< std::string, int > > elementos;
  8.  
  9.  elementos.push_back( std::make_pair( "firstElement", 100 ) );
  10.  elementos.push_back( std::make_pair( "secondElement", 200 ) );
  11.  
  12.  for ( auto it = elementos.begin( ); it != elementos.end( ); ++it )
  13.    std::cout << it->first << " " << it->second << std::endl;
  14. }

Si te da igual el orden, puedes usar un mapa directamente

Código
  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4.  
  5. int main( )
  6. {
  7.  std::map< std::string, int > elementos;
  8.  
  9.  elementos.insert( "firstElement", 100 );
  10.  elementos[ "secondElement" ] = 200;
  11.  
  12.  // volcado iterativo
  13.  for ( auto it = elementos.begin( ); it != elementos.end( ); ++it )
  14.    std::cout << it->first << " " << it->second << std::endl;
  15.  
  16.  // recuperar valores por claves:
  17.  std::cout << "firstElement" << " " << elementos[ "firstElement" ] << std::endl;
  18.  std::cout << "secondElement" << " " << elementos[ "secondElement" ] << std::endl;
  19. }
En línea

nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Datos por claves
« Respuesta #4 en: 27 Junio 2014, 10:52 am »

Hola muchas gracias por responder.

Lo acaba de ver y la mayoria de las cosas las logro entender pero para que sirve el it y el auto ya que veo que lo maneja como tipo reservado.

ya que intente compilarlo me sale varios errores con respeto al it.

o solo es un bosquejo de como quedaria?

gracias por los ejemplos como se  haria con vectores, y con mapas ya que no sabia que eran ni como se pueden usar me ayuda mucho a mis practicas.

Saludos.

Pd: creo que entiendo corrigeme si me equivoco it es una variable de tipo auto.
« Última modificación: 27 Junio 2014, 11:09 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Datos por claves
« Respuesta #5 en: 27 Junio 2014, 11:14 am »

auto es una palabra reservada de C++. Aparece a partir de C++11, por lo que si estás compilando con un compilador antiguo o que no tenga activa la opción C++11 (por ejemplo para MinGw hay que compilar con uno de estos dos flags, depende de la versión: -std=c++0x -std=c++11 )

lo que hace auto es dejar al compilador elegir el tipo de dato:

Código
  1. auto valor1 = 1; // valor sera de tipo int
  2. auto valor2 = 14.5; // valor sera de tipo double

En el caso que ocupa el ejemplo, las siguientes dos líneas son equivalentes:

Código
  1. auto it = elementos.begin( );
  2. std::vector< std::pair< std::string, int > >::iterator it = elementos.begin( );

Aquí se ve claro el motivo por el que uso "auto" en vez de su declaración formal, por claridad.

La otra ventaja que tiene usar "auto" es que si cambio la definición del contenedor no tengo que actualizar el uso del iterador, ya que "auto" hace ese trabajo por mí :). Eso sí, esta palabra es mejor usarla con cuidado porque puede complicar la lectura del código y dar problemas si se usa de forma indiscriminada.

Ya que estamos hablando de esto, it es un iterador. Los iteradores se utilizan para recorrer contenedores en general. Es un elemento muy interesante e importante y saberlo usar aporta bastante potencia a la gestión de contenedores.

En este caso, el bucle for lo que está haciendo es crear un iterador que apunta al primer elemento del contenedor... y recorrerá todos los elementos del vector (++it) hasta que llegue al final.
En línea

nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Datos por claves
« Respuesta #6 en: 28 Junio 2014, 01:21 am »

Gracias por aclarar las dudas ya logre que funcionara y efectivamente era el IDE mil gracias.

Saludos.
En línea

Lo que se puede imaginar... se puede programar.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Hackear base de datos mysql teniendo las claves y datos
Hacking
ReGnuM 9 19,380 Último mensaje 31 Enero 2010, 06:52 am
por toxeek
cuantos datos requiero para obtener las claves wifi usando wifislax
Wireless en Linux
trodans 2 3,506 Último mensaje 26 Mayo 2010, 23:00 pm
por pazienzia
Manejar archivo .txt desde java (ingresar datos, modificar datos, buscar datos y
Java
chuystoty 9 105,713 Último mensaje 20 Mayo 2012, 06:13 am
por ELMED
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines