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
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
IMPLEMENTACIÓN
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(); };
PRINCIPALES BENEFICIOS
Es O (1) (tiempo constante) para crearlo, y con una asignación mínima de memoria adicional.
ALGUNAS COSAS A CONSIDERAR
- Solo debe hacerlo si realmente sabe lo que está haciendo cuando se trata de referencias . Esta solución está diseñada para el propósito específico de la pregunta formulada, para lo cual funciona bastante bien . Emplearlo en cualquier otro contexto puede conducir a un comportamiento inesperado si no está seguro de cómo funcionan las referencias.
- En este ejemplo, AB no proporciona un operador de acceso no constante ([]). Siéntase libre de incluirlo, pero tenga en cuenta: dado que AB contiene referencias, asignarle valores también afectará los elementos originales dentro de A y / o B. Si esta es una característica deseable o no, es una pregunta específica de la aplicación que uno debe Considere cuidadosamente.
- Cualquier cambio realizado directamente en A o B (como asignar valores, ordenar, etc.) también "modificará" AB. Esto no es necesariamente malo (en realidad, puede ser muy útil: AB nunca necesita actualizarse explícitamente para mantenerse sincronizado tanto con A como con B), pero ciertamente es un comportamiento que uno debe tener en cuenta. Excepción importante: cambiar el tamaño de A y / o B a algo más grande puede hacer que estos se reasignen en la memoria (por la necesidad de un espacio contiguo), y esto a su vez invalidaría AB.
- Como cada acceso a un elemento está precedido por una prueba (es decir, "i <v1.size ()"), el tiempo de acceso VecProxy, aunque constante, también es un poco más lento que el de los vectores.
- Este enfoque se puede generalizar a n vectores. No lo he intentado, pero no debería ser un gran problema.