Estoy usando multihilo y quiero fusionar los resultados. Por ejemplo:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Quiero que AB tenga los contenidos de A y los contenidos de B en ese orden. ¿Cuál es la forma más eficiente de hacer algo como esto?
Respuestas:
fuente
Esto es precisamente lo que la función miembro
std::vector::insert
es parafuente
insert
en iteradores de acceso aleatorio y se reservaran por adelantado.distance
tiene una complejidad O (1)). Aún así, las garantías de rendimientoinsert
son algo a tener en cuenta cuando a menudo se puede mejorar planificando con anticipación.size < capacity
mayoría de las veces, la predicción de ramificación probablemente hará que las instrucciones de la ramificación no reasignadas se encuentren en la tubería de instrucciones, minimizando la latencia inducida por ramificaciones, excepto para un recuento de iteraciones bajo. Esto supone una buena implementación de vectores, además de la canalización de instrucciones de la CPU y la predicción de ramificaciones [buenas], pero esas son suposiciones bastante confiables para una cadena de herramientas moderna y una máquina de escritorio. Sin embargo, no sé acerca de los teléfonos inteligentes ..Depende de si realmente necesita concatenar físicamente los dos vectores o si desea dar la apariencia de concatenación en aras de la iteración. La función boost :: join
http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html
te dará esto
debería darte
Tenga en cuenta boost :: join no copia los dos vectores en un nuevo contenedor, sino que genera un par de iteradores (rango) que cubren el lapso de ambos contenedores. Habrá algo de sobrecarga de rendimiento, pero tal vez menos que copiar todos los datos a un nuevo contenedor primero.
fuente
Basado en la respuesta de Kiril V. Lyadvinsky , hice una nueva versión. Este fragmento utiliza la plantilla y la sobrecarga. Con ella, puedes escribir
vector3 = vector1 + vector2
yvector4 += vector3
. Espero que pueda ayudar.fuente
::
se toma;)v1 + v2
no represente la suma.@
como en F #En la dirección de la respuesta de Bradgonesurfing, muchas veces uno realmente no necesita concatenar dos vectores (O (n)), sino que simplemente trabaja con ellos como si estuvieran concatenados (O (1)) . Si este es su caso, se puede hacer sin la necesidad de bibliotecas Boost.
El truco es crear un proxy vectorial: una clase de contenedor que manipula referencias a ambos vectores, vistos externamente como uno único y contiguo.
USO
IMPLEMENTACIÓN
PRINCIPALES BENEFICIOS
Es O (1) (tiempo constante) para crearlo, y con una asignación mínima de memoria adicional.
ALGUNAS COSAS A CONSIDERAR
fuente
Una variante más simple que aún no se mencionó:
Y usando el algoritmo de fusión:
fuente
Si sus vectores están ordenados *, consulte set_union de <algorithm>.
Hay un ejemplo más completo en el enlace.
* gracias rlbond
fuente
Todas las soluciones son correctas, pero me resultó más fácil escribir una función para implementar esto. Me gusta esto:
De esa manera puede evitar la colocación temporal de esta manera:
fuente