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
std::vector<int> A{ 1, 2, 3, 4, 5};
std::vector<int> B{ 10, 20, 30 };
VecProxy<int> AB(A, B); // ----> O(1). No copies performed.
for (size_t i = 0; i < AB.size(); ++i)
std::cout << AB[i] << " "; // 1 2 3 4 5 10 20 30
IMPLEMENTAÇÃO
template <class T>
class VecProxy {
private:
std::vector<T>& v1, v2;
public:
VecProxy(std::vector<T>& ref1, std::vector<T>& ref2) : v1(ref1), v2(ref2) {}
const T& operator[](const size_t& i) const;
const size_t size() const;
};
template <class T>
const T& VecProxy<T>::operator[](const size_t& i) const{
return (i < v1.size()) ? v1[i] : v2[i - v1.size()];
};
template <class T>
const size_t VecProxy<T>::size() const { return v1.size() + v2.size(); };
PRINCIPAIS BENEFÍCIOS
É O (1) (tempo constante) para criá-lo e com alocação de memória extra mínima.
ALGUMAS COISAS A CONSIDERAR
- Você só deve fazer isso se realmente souber o que está fazendo ao lidar com referências . Esta solução é destinada ao objetivo específico da pergunta feita, para a qual funciona muito bem . Empregá-lo em qualquer outro contexto pode levar a um comportamento inesperado se você não tiver certeza de como as referências funcionam.
- Neste exemplo, AB não fornece um operador de acesso não-const ([]). Sinta-se à vontade para incluí-lo, mas lembre-se: como AB contém referências, atribuir valores a ele também afetará os elementos originais em A e / ou B. Se esse é um recurso desejável ou não, é uma pergunta específica do aplicativo. considere cuidadosamente.
- Quaisquer alterações feitas diretamente em A ou B (como atribuir valores, classificar etc.) também "modificarão" AB. Isso não é necessariamente ruim (na verdade, pode ser muito útil: a AB nunca precisa ser atualizada explicitamente para se manter sincronizada com A e B), mas é certamente um comportamento que você deve estar ciente. Exceção importante: redimensionar A e / ou B para sth maior pode levar a que eles sejam realocados na memória (para a necessidade de espaço contíguo) e isso, por sua vez, invalidaria AB.
- Como todo acesso a um elemento é precedido por um teste (ou seja, "i <v1.size ()"), o tempo de acesso ao VecProxy, embora constante, também é um pouco mais lento que o dos vetores.
- Essa abordagem pode ser generalizada para n vetores. Eu não tentei, mas não deve ser grande coisa.