¿Es posible crear un vector de iteradores?

Iniciado por Orubatosu, 27 Noviembre 2014, 20:03 PM

0 Miembros y 1 Visitante están viendo este tema.

Orubatosu

Lo mismo la pregunta es tonta, o no, pero en uno de los problemas que estoy trabajando ahora, me piden una función que devuelva (literalmente) un un vector de iteradores

Bueno, la clase vector... estupendo. Vectores de enteros, de caracteres, strings, incluso vectores, tuplas.. no veo problemas.

Pero en ningún lado he podido encontrar documentación (o no la se encontrar) que me diga como narices declaro un vector de iteradores.

Aclaro, que por vector me refiero a un contenedor del tipo:


#include <vector>
...
int main(){
     vector<int> MiVector; // Declaración de vector de enteros
     vector<int>::iterator MiIterador; // Declaración de un iterador.
}



No tengo claro si realmente puedo hacer algo así, o simplemente el "problema" tiene un gazapo como una catedral. Si se tratara de devolver un vector con las posiciones (para acceder según el método clásico de Dato[indice]) no encontraría mayor problema.
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

_Enko

#1
Hola, que tal un vector de punteros a iteradores?   O mejor dicho un vector de punteros a  Clases.

Me refiero declaras un tipo iterador heredando de la clase iterator. Luego simplemente declaras el vector como puntero a dicha clase.

Saludos.

Orubatosu

Urh... ¿puedes extenderte un poco en esa posibilidad?... mas que nada porque de entrada, considero que las conjugaciones de japonés parecen ser mas sencillas  :huh:

Ten en cuenta que ando bastante verde en este tema de los iteradores, tan verde que se podría poner mi foto en la wikipedia como ejemplo de "color verde"
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

_Enko

#3
Mh... años que no programo en cpp  :-[

pero este ejemplo compila xD

Código (cpp) [Seleccionar]

class MyIterator : public std::iterator<std::input_iterator_tag, int>
{........
};

int main () {
   std::vector<MyIterator> myvector;


O bien esto:
Código (cpp) [Seleccionar]

typedef std::vector<std::string> strV;
   typedef strV::iterator str_vet_iter;
   std::vector<str_vet_iter> MyVector_Of_String_Iterators;

Orubatosu

En realidad es mucho lio para reinventar la rueda.

En realidad, planteando el problema desde un punto de vista lógico, no necesitaría en realidad un "vector de punteros", me bastaría con un vector de enteros donde almacenara la distancia entre cada elemento elegido y el inicio del vector, y luego usar un iterador sumándole los diferentes elementos, ya que un iterador permite operaciones de suma con enteros.

Dicho de otro modo, si quiere un vector que almacene "donde están las posiciones que quiero de otro vector", me basta en teoría con un vector de enteros que indique las casillas donde se encuentran los resultados, y acceder a los mismos ya sea mediante la solución "clasica" de "Nombre_de_vector[casilla a acceder]" o calculando la distancia desde la casilla 0 del mismo.

Aprecio la aportación (aunque ahora mismo la verdad es que me pierdo la mitad, pero me lo guardo para cuando llegue a esas cosas), pero la pregunta es otra, si la clase vector puede aceptar como típo para la misma un objeto como un iterador.

Si no puede, entonces simplemente interpreto que la pregunta del problema está mal planteada, y me busco una solución sencilla como la que he comentado.

Vamos, que quiero aprender a andar antes que correr
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

_Enko

#5
CitarAprecio la aportación (aunque ahora mismo la verdad es que me pierdo la mitad, pero me lo guardo para cuando llegue a esas cosas), pero la pregunta es otra, si la clase vector puede aceptar como típo para la misma un objeto como un iterador.

Siguiendo tu ejemplo entonces si:

Código (cpp) [Seleccionar]

vector<int> MiVector; // Declaración de vector de enteros
typedef vector<int>::iterator MiTipoIterador; // Declaración de un tipo iterador.
vector<MiTipoIterador> MiVectorDeIteradores;


Habria que declarar el tipo del iterador y luego crear un vector con ese tipo de iterador.

Aunque la verdad que no soy experto aqui n imucho menos xD

Y no, no necesitas un vector de punteros... cuando te escribí eso estaba pensando en otra cosa. (En un vector de punteros a una clase que si bien tiene que ver aqui, no era lo que necesitabas)

Saludos

Orubatosu

Lo probaré a ver que pasa... probar afortunadamente es gratis  ;D

Y no me habré explicado... mi solución es mas "campestre"... simplemente supongamos que tengo un vector, por ejemplo de enteros (en el problema son tuplas, pero eso es irrelevante)

vector<int>Mi_Vector ={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

Y supongamos que por ejemplo, quiero un "vector de iteradores" que señale a los primos dentro de ese vector.

O bien uso tu solución (a estas horas no... mañana por favor) o simplemente creo otro vector de enteros tal que contenga 1, 3, 5, 7, 11 (en realidad 0, 2, 4, 6, 10)

Luego al iterador que recorrerá ese vector le asigno cero ( Mi_vector.size() ) y le voy sumando el contenido de ese segundo vector.

No obstante... en principio cuela y el compilador no se ha quejado, ya te contaré si consigo hacerlo funcionar, porque estos temas al final pueden interesar a mas gente
"When People called me freak, i close my eyes and laughed, because they are blinded to happiness"
Hideto Matsumoto 1964-1998

_Enko

Creo que ya entiendo lo que necesitas y tu idea esta bien.

Tienes un vector con los elementos  v = (1,2,3,4,5,6,7,8,9,10,11,12...)

Luego simplemente creas otro vector donde guardas el indice de los elementos que necesitas  index = (0,2...)

La otra opcion, sería un vector de punteros a int, y que apunten a los elementos del primer vector mhh. De esa manera no guardarias la posicion dentro del primer vector, sino un puntero directamente al elemento.

Código (cpp) [Seleccionar]

vector<int> v;
vector<int*> p;
vector<int> i;

int x; //indice
   
i.push_back(x); // agrega la posicion donde se encuentra el elemento dentro del vector V
p.push_back(&v[x]); //agrega puntero al elemento dentro del vector V. Si el elementro cambia, cambia el valor.


en el vector i, agregarias 0,2,4,6..
en el vector p, agregarias punetros a 1,3,5,7

En realidad, depende de la utilidad practicamente lo mismo.

Saludos.