vectors example c++ vector reference stl containers

example - vector insert c++



¿Por qué no puedo hacer un vector de referencias? (8)

Como han mencionado otros, es probable que termines usando un vector de punteros.

Sin embargo, es posible que desee considerar utilizar un boost::ptr_vector<int> en boost::ptr_vector<int> lugar!

Cuando hago esto:

std::vector<int> hello;

Todo funciona muy bien. Sin embargo, cuando lo hago un vector de referencias en su lugar:

std::vector<int &> hello;

Recibo errores horribles como "error C2528: ''puntero'': el puntero a referencia es ilegal".

Quiero poner un montón de referencias a estructuras en un vector, para que no tenga que interferir con los punteros. ¿Por qué el vector está haciendo una rabieta sobre esto? ¿Es mi única opción utilizar un vector de punteros en su lugar?


Como lo sugieren los otros comentarios, está limitado a usar punteros. Pero si ayuda, aquí hay una técnica para evitar enfrentarse directamente con los punteros.

Puedes hacer algo como lo siguiente:

vector<int*> iarray; int default_item = 0; // for handling out-of-range exception int& get_item_as_ref(unsigned int idx) { // handling out-of-range exception if(idx >= iarray.size()) return default_item; return reinterpret_cast<int&>(*iarray[idx]); }


El tipo de componente de contenedores como vectores debe ser assignable . Las referencias no son asignables (solo puede inicializarlas una vez cuando se declaran, y no puede hacer que se refieran a otra cosa más adelante). Otros tipos no asignables tampoco están permitidos como componentes de contenedores, por ejemplo, vector<const int> no está permitido.


Es un defecto en el lenguaje C ++. No puede tomar la dirección de una referencia, ya que intentar hacerlo daría lugar a que se haga referencia a la dirección del objeto y, por lo tanto, nunca podrá obtener un puntero a una referencia. std::vector trabaja con punteros a sus elementos, por lo que los valores que se almacenan deben poder señalarse. Tendrás que usar punteros en su lugar.


Ion Todirel ya mencionó una respuesta usando std::reference_wrapper . Desde C ++ 11 , tenemos un mecanismo para recuperar objetos de std::vector y eliminar la referencia utilizando std::remove_reference . A continuación se muestra un ejemplo compilado usando g++ y clang con opción
-std=c++11 y ejecutado con éxito.

#include <iostream> #include <vector> #include<functional> class MyClass { public: void func() { std::cout << "I am func /n"; } MyClass(int y) : x(y) {} int getval() { return x; } private: int x; }; int main() { std::vector<std::reference_wrapper<MyClass>> vec; MyClass obj1(2); MyClass obj2(3); MyClass& obj_ref1 = std::ref(obj1); MyClass& obj_ref2 = obj2; vec.push_back(obj_ref1); vec.push_back(obj_ref2); for (auto obj3 : vec) { std::remove_reference<MyClass&>::type(obj3).func(); std::cout << std::remove_reference<MyClass&>::type(obj3).getval() << "/n"; } }


Por su propia naturaleza, las referencias solo se pueden establecer en el momento en que se crean; Es decir, las siguientes dos líneas tienen efectos muy diferentes:

int & A = B; // makes A an alias for B A = C; // assigns value of C to B.

Además, esto es ilegal:

int & D; // must be set to a int variable.

Sin embargo, cuando creas un vector, no hay forma de asignar valores a sus elementos en la creación. Básicamente estás haciendo un montón del último ejemplo.


sí, puedes buscar std::reference_wrapper , que imita una referencia pero que se puede asignar y que también puede ser "reenviado"


boost::ptr_vector<int> funcionará.

Editar: fue una sugerencia de usar std::vector< boost::ref<int> > , que no funcionará porque no se puede crear un boost::ref .