| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
jc Lt JG

Registrado: 02 Mar 2004Mensajes: 68
|
Publicado: Mar 25 May, 2004 9:36 am Asunto: Crear un Conjunto con Ansistring |
|
|
Hola:
Pues eso, que necesito crear un conjunto en el que luego ir introduciendo variables AnsiString, más en concreto direcciones IP donde la primera ip posible a introducir fuera por ejemplo "0.0.0.0" y la última "255.255.255.255".
Mi idea es crear ese conjunto de forma que a lo largo del programa voy introduciendo direcciones dentro, para luego ver si una IP cualquiera pertenece o no al conjunto. El problema es que no sé cómo crearlo.
Gracias y un saludo.
JC |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mar 25 May, 2004 11:44 am Asunto: |
|
|
Si sólo quieres almacenar los strings puedes usar la clase "set".
Si además quieres asociar algo de información a cada IP, puedes emplear la clase "map".
Busca en la ayuda del Builder cualquiera de las dos y encontrarás más información, y si no, en cualquier manual de C++
Ten en cuenta que son "templates", así q tienes q declararlos de la forma:
| Código: |
set<AnsiString> conjunto1;
|
Creo q en el foro hay varios temas referentes al uso de templates así q usa la opción "buscar" para más información. |
|
| Volver arriba |
|
 |
jc Lt JG

Registrado: 02 Mar 2004Mensajes: 68
|
Publicado: Mar 25 May, 2004 12:14 pm Asunto: |
|
|
Si yo ya sé que supuestamente hay que hacerlo con set, pero el código:
Set <AnsiString> conjunto1;
no funciona. Necesita un elemento "minimo" y otro "máximo". ese es mi problema, con enteros no hay problema pero al poner direcciones IP (cadenas de texto del tipo "192.168.10.25" no funciona.
Gracias y un saludo. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 25 May, 2004 5:42 pm Asunto: |
|
|
Lo ha puesto en minúsculas, por lo que supongo que el se estaba refiriendo al "set" de la librería estándar de C++ y no al "Set" de la VCL.
Un pequeño ejemplo de su uso:
| Código: | #include <set>
std::set<AnsiString> conjunto;
// Añadimos elementos al conjunto
conjunto.insert("192.168.10.25");
conjunto.insert("0.0.0.0");
conjunto.insert("255.255.255.255");
// Comprobamos si un elemento determinado existe en el conjunto
if (conjunto.find("0.0.0.0") != conjunto.end())
ShowMessage("0.0.0.0 es parte del conjunto");
else
ShowMessage("NO es parte del conjunto");
// Averiguamos cuantos elementos distintos hay
int numElementos = conjunto.size();
// Recorremos el conjunto y lo mostramos en un TListBox
std::set<AnsiString>::iterator iter;
for (iter = conjunto.begin(); iter != conjunto.end(); iter++)
{
ListBox1->Items->Add(*iter);
} |
|
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mie 26 May, 2004 9:15 am Asunto: |
|
|
| Efectivamente me refería al "set" de la librería estándar de C++. Gracias _Leo por poner un ejemplo concreto, q yo no tenía el Builder a mano y no pude hacerlo. |
|
| Volver arriba |
|
 |
jc Lt JG

Registrado: 02 Mar 2004Mensajes: 68
|
Publicado: Mie 26 May, 2004 10:55 am Asunto: |
|
|
Joder Leo, ¿qué íbamos a hacer sin tu ayuda...? No sólo contestas a mi duda, sino que vas más allá. Gracias.
Una cosita más:
¿Me puedes/podéis explicar la línea:
std::set<AnsiString>::iterator iter;
He estado mirando la ayuda pero no acabo de entenderlo, lo siento.
Un saludo. |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mie 26 May, 2004 12:56 pm Asunto: |
|
|
En esa línea se está declarando un iterador, que es básicamente un puntero inteligente para moverse por los elementos de una estructura. Imagina que tuvieras una lista de enteros de la forma más básica:
| Código: |
typedef struct ListaInt {
int elem;
struct ListaInt *siguiente;
} ListaInt;
ListaInt *primero = NULL;
|
Para desplazarte por todos los elementos de esa lista harías:
| Código: |
ListaInt *aux = primero;
while (aux != NULL) {
// Hacer algún proceso con el elemento aux
aux = aux->siguiente;
}
|
Pues lo mismo realizan los iteradores, sólo que tú te puedes olvidar de cómo funciona internamente la estructura que los emplea. Esto facilita tus tareas de programador.
Cualquier estructura que permita un iterador incluye, según el estándar, una función begin para devolverte un iterador que apunte al primer elemento de la estructura; y una función end para el último elemento.
Los iteradores además suelen tener sobrecargado el operador "++", con lo que para avanzar de elemento en elemento basta con hacer "it++".
Además de estas funciones básicas encontrarás, dependiendo de la clase, funciones para acceder a un elemento concreto de la lista en forma de iterador, o para recorrer los elementos en sentido inverso (--)... |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mie 26 May, 2004 1:00 pm Asunto: |
|
|
Ah, me olvidaba...
Para acceder al elemento al que apunta el iterador se usa el operador "*", tal como puso _Leo en su ejemplo:
| Código: |
ListBox1->Items->Add(*iter);
// Estás accediendo al elemento apuntado por iter
|
|
|
| Volver arriba |
|
 |
jc Lt JG

Registrado: 02 Mar 2004Mensajes: 68
|
Publicado: Mie 26 May, 2004 2:59 pm Asunto: |
|
|
Gracias masBecas:
Da gusto recibir contestaciones tan rápidas y eficientes.
A cuidarse.
Un saludo. |
|
| Volver arriba |
|
 |
|