Estou usando a multitreading e quero mesclar os resultados. Por exemplo:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Eu quero que AB tenha o conteúdo de A e o conteúdo de B nessa ordem. Qual é a maneira mais eficiente de fazer algo assim?
Respostas:
fonte
Este é precisamente o que a função de membro
std::vector::insert
é parafonte
insert
em iteradores de acesso aleatório e reservassem antecipadamente.distance
tem complexidade O (1)). Ainda assim, as garantias de desempenhoinsert
são algo a ser lembrado quando você pode fazer melhor planejando com antecedência.size < capacity
maioria das vezes, a previsão de ramificação provavelmente fará com que as instruções da ramificação não realocada estejam no pipeline de instruções, minimizando a latência induzida por ramificação, exceto pela baixa contagem de iterações. Isso pressupõe uma boa implementação vetorial, mais o pipeline de instruções da CPU e a [boa] previsão de ramificação, mas essas são suposições bastante confiáveis para uma moderna cadeia de ferramentas e máquina de desktop. Não sei sobre smartphones embora ..Depende se você realmente precisa concatenar fisicamente os dois vetores ou se deseja dar a aparência de concatenação por causa da iteração. A função boost :: join
http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html
vai te dar isso.
deveria te dar
Nota boost :: join não copia os dois vetores em um novo contêiner, mas gera um par de iteradores (intervalo) que cobrem a extensão dos dois contêineres. Haverá alguma sobrecarga de desempenho, mas talvez menos que a cópia de todos os dados para um novo contêiner primeiro.
fonte
Baseado na resposta de Kiril V. Lyadvinsky , fiz uma nova versão. Esse snippet usa modelo e sobrecarga. Com ele, você pode escrever
vector3 = vector1 + vector2
evector4 += vector3
. Espero que possa ajudar.fonte
::
é tomado;)v1 + v2
não representa adição.@
como em F #Na direção da resposta de Bradgonesurfing, muitas vezes não é necessário concatenar dois vetores (O (n)), mas sim trabalhar com eles como se fossem concatenados (O (1)) . Se este for o seu caso, isso pode ser feito sem a necessidade de bibliotecas Boost.
O truque é criar um proxy de vetor: uma classe de wrapper que manipula referências a ambos os vetores, vistos externamente como um único e contíguo.
USO
IMPLEMENTAÇÃO
PRINCIPAIS BENEFÍCIOS
É O (1) (tempo constante) para criá-lo e com alocação de memória extra mínima.
ALGUMAS COISAS A CONSIDERAR
fonte
Mais uma variante simples que ainda não foi mencionada:
E usando o algoritmo de mesclagem:
fonte
Se seus vetores forem classificados *, verifique set_union em <algorithm>.
Há um exemplo mais completo no link
* obrigado rlbond
fonte
Todas as soluções estão corretas, mas achei mais fácil escrever uma função para implementar isso. como isso:
Dessa forma, você pode evitar o posicionamento temporário como este:
fonte