В направлении ответа Bradgonesurfing, часто не нужно объединять два вектора (O (n)), а просто работать с ними, как если бы они были объединены (O (1)) . Если это ваш случай, это можно сделать без использования библиотек Boost.
Хитрость заключается в том, чтобы создать векторный прокси: класс-обертка, который манипулирует ссылками на оба вектора, внешне рассматриваемый как один, непрерывный.
ИСПОЛЬЗОВАНИЕ
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
РЕАЛИЗАЦИЯ
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(); };
ОСНОВНАЯ ВЫГОДА
Это O (1) (постоянное время) для его создания и с минимальным выделением дополнительной памяти.
НЕКОТОРЫЕ ВЕЩИ ДЛЯ РАССМОТРЕНИЯ
- Вы должны пойти на это, только если вы действительно знаете, что делаете, когда имеете дело со ссылками . Это решение предназначено для конкретной цели поставленного вопроса, для которого оно работает довольно хорошо . Использование его в любом другом контексте может привести к неожиданному поведению, если вы не уверены в том, как работают ссылки.
- В этом примере AB не предоставляет неконстантный оператор доступа ([]). Не стесняйтесь включать его, но имейте в виду: поскольку AB содержит ссылки, присвоение ему значений также повлияет на исходные элементы в A и / или B. Независимо от того, является ли это желательной функцией, это вопрос для конкретного приложения, который следует внимательно обдумайте.
- Любые изменения, внесенные непосредственно в A или B (например, присвоение значений, сортировка и т. Д.), Также «изменят» AB. Это не обязательно плохо (на самом деле, это может быть очень удобно: AB никогда не нужно явно обновлять, чтобы синхронизировать себя как с A, так и с B), но это определенно поведение, о котором нужно знать. Важное исключение: изменение размера A и / или B до большего может привести к тому, что они будут перераспределены в памяти (для непрерывного пространства), что, в свою очередь, приведет к аннулированию AB.
- Поскольку каждому доступу к элементу предшествует тест (а именно, «i <v1.size ()»), время доступа VecProxy, хотя и постоянное, также немного медленнее, чем у векторов.
- Этот подход можно обобщить на n векторов. Я не пробовал, но это не должно иметь большого значения.