Nella direzione della risposta di Bradgonesurfing, molte volte non è necessario concatenare due vettori (O (n)), ma invece lavorare con loro come se fossero concatenati (O (1)) . Se questo è il tuo caso, può essere fatto senza la necessità di librerie Boost.
Il trucco è creare un proxy vettoriale: una classe wrapper che manipola i riferimenti ad entrambi i vettori, visti esternamente come uno singolo, 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
IMPLEMENTAZIONE
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(); };
VANTAGGI PRINCIPALI
È O (1) (tempo costante) per crearlo e con allocazione di memoria aggiuntiva minima.
ALCUNI PRODOTTI DA CONSIDERARE
- Dovresti provarlo solo se sai davvero cosa stai facendo quando hai a che fare con i riferimenti . Questa soluzione è intesa per lo scopo specifico della domanda posta, per la quale funziona abbastanza bene . Impiegarlo in qualsiasi altro contesto può portare a comportamenti imprevisti se non si è sicuri del funzionamento dei riferimenti.
- In questo esempio, AB non fornisce un operatore di accesso non const ([]). Sentiti libero di includerlo, ma tieni a mente: poiché AB contiene riferimenti, assegnargli i valori influenzerà anche gli elementi originali in A e / o B. Se questa è una caratteristica desiderabile o meno, è una domanda specifica dell'applicazione che dovresti considerare attentamente.
- Qualsiasi modifica apportata direttamente ad A o B (come l'assegnazione di valori, l'ordinamento, ecc.) "Modifica" anche AB. Questo non è necessariamente negativo (in realtà, può essere molto utile: AB non ha mai bisogno di essere aggiornato esplicitamente per mantenersi sincronizzato con A e B), ma è certamente un comportamento di cui bisogna essere consapevoli. Eccezione importante: ridimensionare A e / o B su sth più grande può comportare la riallocazione di questi in memoria (per la necessità di spazio contiguo) e ciò a sua volta invaliderebbe AB.
- Poiché ogni accesso a un elemento è preceduto da un test (ovvero "i <v1.size ()"), il tempo di accesso a VecProxy, sebbene costante, è anche un po 'più lento di quello dei vettori.
- Questo approccio può essere generalizzato a n vettori. Non ho provato, ma non dovrebbe essere un grosso problema.