Dans le sens de la réponse de Bradgonesurfing, souvent, on n'a pas vraiment besoin de concaténer deux vecteurs (O (n)), mais plutôt de travailler avec eux comme s'ils étaient concaténés (O (1)) . Si tel est votre cas, cela peut être fait sans avoir besoin des bibliothèques Boost.
L'astuce consiste à créer un proxy vectoriel: une classe wrapper qui manipule les références aux deux vecteurs, vu extérieurement comme un seul et contigu.
USAGE
std::vector<int> A{ 1, 2, 3, 4, 5};
std::vector<int> B{ 10, 20, 30 };
VecProxy<int> AB(A, B);
for (size_t i = 0; i < AB.size(); ++i)
std::cout << AB[i] << " ";
LA MISE EN OEUVRE
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(); };
PRINCIPAL AVANTAGE
C'est O (1) (temps constant) pour le créer, et avec une allocation de mémoire supplémentaire minimale.
QUELQUES CHOSES À CONSIDÉRER
- Vous ne devriez y aller que si vous savez vraiment ce que vous faites en matière de références . Cette solution est destinée à l'objectif spécifique de la question posée, pour laquelle elle fonctionne plutôt bien . L'employer dans tout autre contexte peut entraîner un comportement inattendu si vous n'êtes pas sûr du fonctionnement des références.
- Dans cet exemple, AB ne fournit pas d' opérateur d'accès non const ([]). N'hésitez pas à l'inclure, mais gardez à l'esprit: puisque AB contient des références, lui attribuer des valeurs affectera également les éléments d'origine dans A et / ou B.Que ce soit une fonctionnalité souhaitable ou non, c'est une question spécifique à l'application, il faut réfléchissez bien.
- Toutes les modifications apportées directement à A ou B (comme l'attribution de valeurs, le tri, etc.) "modifieront" également AB. Ce n'est pas nécessairement mauvais (en fait, cela peut être très pratique: AB n'a jamais besoin d'être explicitement mis à jour pour rester synchronisé avec A et B), mais c'est certainement un comportement dont il faut être conscient. Exception importante: redimensionner A et / ou B à qch plus grand peut conduire à une réallocation en mémoire (pour le besoin d'espace contigu), ce qui à son tour invaliderait AB.
- Parce que chaque accès à un élément est précédé d'un test (à savoir, "i <v1.size ()"), le temps d'accès à VecProxy, bien que constant, est également un peu plus lent que celui des vecteurs.
- Cette approche peut être généralisée à n vecteurs. Je n'ai pas essayé, mais ça ne devrait pas être un gros problème.