vectors librerias libreria estandar ejemplos ejemplo dev c++ c++11 stl compiler-errors rvalue

c++ - librerias - Cómo anexar/copiar un objeto contenedor STL a otro objeto cuando su valor no es copiable, por ejemplo, std:: hilo



vector stl c++ ejemplos (5)

La solución general: muévela.

Sin embargo, mientras std::move() puede mover un solo valor, no puede mover un rango de valores. Deberás escribir un bucle:

for (auto&& pair : m1) m2[pair.first] = std::move(pair.second)

Quiero mover un objeto de contenedor std::map a otro. En la forma más simple:

#include<map> #include<thread> #include<vector> using namespace std; int main () { map<void*, vector<thread>> m1, m2; // m1 is updated m1.insert(m2.begin(), m2.end()); // <--- problem here m2.clear(); // not required anymore }

Sin embargo, da una página de error :

error: use of deleted function ‘std::thread::thread(const std::thread&)’

¿Cómo lograr esto?


Muévelos, usando iteradores de movimiento:

m1.insert(make_move_iterator(begin(m2)), make_move_iterator(end(m2)));


No creo que puedas insertar una gama de elementos que solo sean móviles. Sin embargo, debería poder std::move() los elementos individuales:

for (auto& element: m2) { m1.emplace(element.first, std::move(element.second)); }


std::thread no es copiable, tendrás que usar un iterador que permita movimientos:

m1.insert(std::make_move_iterator(m2.begin()), std::make_move_iterator(m2.end());

std::make_move_iterator devuelve una clase de iterador especializado std::move_iterator cuyos miembros de acceso ( operator*() y operator->() ) devuelven referencias a rvalues ​​a diferencia de los iteradores integrados que devuelven lvalues. map::insert() delega su operación en map::emplace() donde reenvía el argumento al tipo de elemento.

Se llamaba a los constructores de copia de sus hilos porque los objetos devueltos de los iteradores incorporados se enviaban como lvalues y, por lo tanto, se copiaban.


Para completar, hay una versión poco conocida de std::move en <algorithm> que sigue un patrón similar a std::copy .

Entonces puedes escribir esto:

move(begin(m2), end(m2), inserter(m1, begin(m1))); m2.clear();

referencia aquí