Pregunta

Me pregunto, debido a un problema que tengo, ¿es posible crear un vector de punteros?Y si es así, ¿cómo?Específicamente sobre el uso de iteradores y .begin() con él, es decir:¿Cómo convertiría este vector en un vector de punteros?

class c
{
     void virtual func();
};

class sc:public c
{
     void func(){cout<<"using func";}
};

sc cobj;

vector<c>cvect
cvect.push_back(cobj);
vector<c>::iterator citer

for(citer=cvect.begin();citer<cvect.end();citer++)
{
     citer->func();
}
¿Fue útil?

Solución 2

vector <c> cvect no es un vector de punteros. Es un vector de objetos de tipo c. Quieres vector <c*> cvect. y el que probablemente quieras:

cvect.push_back( new c );

Y luego, dado un iterador, quieres algo como:

(*it)->func();

Por supuesto, es bastante probable que no quisieras un vector de punteros en primer lugar ...

Otros consejos

Claro.

vector<c*> cvect;
cvect.push_back(new sc);
vector<c*>::iterator citer;
for(citer=cvect.begin(); citer != cvect.end(); citer++) {
  (*citer)->func();
}

Cosas a tener en cuenta:

Tendrá que limpiar después de usted mismo si usa memoria asignada dinámicamente como lo hice en mi ejemplo

por ejemplo:

 for(...) { delete *i; }

Esto se puede simplificar usando un vector de shared_ptr s (como boost::shared_ptr). No intente utilizar std::auto_ptr para esto, no funcionará (ni siquiera compilará).

Otra cosa a tener en cuenta, debe evitar usar < para comparar iteradores en su ciclo cuando sea posible, solo funcionará para iteradores que modelen un iterador de acceso aleatorio, lo que significa que no puede cambiar su código a utilizar, por ejemplo un std::list.

Sí, es posible, y de hecho es necesario usar punteros si pretende que su vector contenga objetos de una jerarquía de clase completa en lugar de un solo tipo. (No utilizar punteros dará como resultado el temido problema de segmentación de objetos : todos los objetos están en silencio convertido al tipo de clase base. Esto no es diagnosticado por el compilador, y es casi seguro que no sea lo que desea).

class c
{
     void virtual func();
};

class sc:public c
{
     void func(){cout<<"using func";}
};

sc cobj;

vector<c*> cvect;             // Note the type is "c*"
cvect.push_back(&cobj);       // Note the "&"
vector<c*>::iterator citer;

for(citer=cvect.begin();citer != cvect.end();citer++)   // Use "!=" not "<"
{
     (*citer)->func();
}

Tenga en cuenta que con un vector de punteros, necesita hacer su propia administración de memoria , así que tenga mucho cuidado: si va a utilizar objetos locales (como se indicó anteriormente), no deben caerse. de alcance antes de que lo haga el contenedor. Si usa punteros a objetos creados con new, deberá delete hacerlos manualmente antes de destruir el contenedor. Debería considerar usar punteros inteligentes en este caso, como el smart_ptr proporcionado por Boost .

Si seguro.

// TestCPP.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <vector>


using namespace std;

class c
{
public:
    void virtual func() = 0;
};

class sc:public c
{
public:
    void func(){cout<<"using func";}
};

int _tmain(int argc, _TCHAR* argv[])
{
    sc cobj;

    vector<c*> cvect;
    cvect.push_back(&cobj);
    vector<c*>::iterator citer;

    for(citer=cvect.begin();citer<cvect.end();citer++)
    {
        (*citer)->func();
    }

    return 0;
}

Tenga en cuenta la declaración de vector<c*> cvect y el uso de cvect.push_back(&cobj).

Según el código proporcionado, estás utilizando el iterador de forma incorrecta.Para acceder al miembro al que apunta un iterador, debe utilizar *citer en lugar de citer solo.

Ha creado vector<c*> para un vector de punteros. Luego use new para asignar la memoria para objetos c y empujarlos al vector. Además, no olvide que tiene que delete usted mismo y vector.clear () no liberará la memoria asignada para los objetos c. Debe almacenar c como un vector de punteros aquí, de lo contrario, la llamada a la función virtual no funcionará.

Pruebe Boost Pointer Container Library . Tiene varias ventajas sobre el vector regular de punteros, como:

my_container.push_back( 0 );            // throws bad_ptr 
ptr_vector<X> pvec; 
std::vector<X*> vec;
( *vec.begin() )->foo(); // call X::foo(), a bit clumsy
pvec.begin()->foo();     // no indirection needed
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top