Dalam arah jawaban Bradgonesurfing, berkali-kali seseorang tidak perlu menggabungkan dua vektor (O (n)), tetapi hanya bekerja dengan mereka seolah-olah mereka digabungkan (O (1)) . Jika ini adalah kasus Anda, itu dapat dilakukan tanpa perlu meningkatkan perpustakaan.
Triknya adalah membuat proksi vektor: kelas pembungkus yang memanipulasi referensi ke kedua vektor, secara eksternal dilihat sebagai satu, yang berdekatan.
PEMAKAIAN
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
PENERAPAN
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(); };
MANFAAT UTAMA
Ini O (1) (waktu konstan) untuk membuatnya, dan dengan alokasi memori ekstra minimal.
BEBERAPA STUFF UNTUK MEMPERTIMBANGKAN
- Anda hanya harus melakukannya jika Anda benar-benar tahu apa yang Anda lakukan ketika berhadapan dengan referensi . Solusi ini dimaksudkan untuk tujuan khusus dari pertanyaan yang dibuat, yang mana ia bekerja dengan cukup baik . Menggunakannya dalam konteks lain apa pun dapat menyebabkan perilaku yang tidak terduga jika Anda tidak yakin tentang cara kerja referensi.
- Dalam contoh ini, AB tidak menyediakan operator akses non-const ([]). Jangan ragu untuk memasukkannya, tetapi perlu diingat: karena AB berisi referensi, untuk menetapkan nilai-nilai itu juga akan mempengaruhi elemen asli dalam A dan / atau B. Apakah ini fitur yang diinginkan atau tidak, ini adalah pertanyaan khusus aplikasi yang harus hati-hati mempertimbangkan.
- Setiap perubahan yang dilakukan langsung ke A atau B (seperti menetapkan nilai, pengurutan, dll.) Juga akan "memodifikasi" AB. Ini tidak selalu buruk (sebenarnya, itu bisa sangat berguna: AB tidak pernah perlu diperbarui secara eksplisit untuk menjaga dirinya disinkronkan dengan A dan B), tetapi itu tentu saja perilaku yang harus diperhatikan. Pengecualian penting: mengubah ukuran A dan / atau B menjadi lebih besar dapat menyebabkan ini dialokasikan kembali dalam memori (untuk kebutuhan ruang yang berdekatan), dan ini pada gilirannya akan membatalkan AB.
- Karena setiap akses ke elemen didahului oleh tes (yaitu, "i <v1.size ()"), waktu akses VecProxy, meskipun konstan, juga sedikit lebih lambat daripada vektor.
- Pendekatan ini dapat digeneralisasikan ke n vektor. Saya belum mencoba, tetapi itu seharusnya tidak menjadi masalah besar.