У напрямку відповіді Бредгонесурфінга багато разів не потрібно поєднувати два вектори (O (n)), а натомість просто працювати з ними так, ніби вони з'єднані (O (1)) . Якщо це ваш випадок, це можна зробити без необхідності збільшення бібліотек.
Трюк полягає у створенні векторного проксі: класу обгортки, який маніпулює посиланнями на обидва вектори, зовні розглядається як єдиний, суміжний.
ВИКОРИСТАННЯ
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 не забезпечує оператора доступу без дозволу ([]). Не соромтеся включати його, але пам’ятайте: оскільки АВ містить посилання, присвоєння ним значень також вплине на оригінальні елементи в межах А та / або В. Чи це бажана особливість, чи ні, це питання, яке стосується додатків, слід уважно розглянути.
- Будь-які зміни, безпосередньо внесені до A або B (наприклад, присвоєння значень, сортування тощо), також "модифікують" AB. Це не обов'язково погано (насправді це може бути дуже зручно: AB ніколи не потрібно чітко оновлювати, щоб він був синхронізований як до А, так і до В), але це, безумовно, поведінка, якої слід знати. Важливий виняток: зміни розміру A і / або B на sth більше може призвести до їх перерозподілу в пам'яті (для необхідності суміжного простору), а це, в свою чергу, призведе до недійсності AB.
- Оскільки кожному доступу до елемента передує тест (а саме "i <v1.size ()"), час доступу до VecProxy, хоча і постійний, також трохи повільніше, ніж у векторів.
- Цей підхід можна узагальнити до n векторів. Я не пробував, але це не повинно бути великою справою.