Theo hướng trả lời của Bradgonesurfing, nhiều lần người ta không thực sự cần ghép hai vectơ (O (n)), mà thay vào đó chỉ làm việc với chúng như thể chúng được nối (O (1)) . Nếu đây là trường hợp của bạn, nó có thể được thực hiện mà không cần thư viện Boost.
Bí quyết là tạo một proxy vector: một lớp bao bọc thao tác các tham chiếu đến cả hai vectơ, được xem bên ngoài như là một lớp duy nhất, liền kề nhau.
SỬ DỤNG
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
THỰC HIỆN
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(); };
LỢI ÍCH CHÍNH
Đó là O (1) (thời gian không đổi) để tạo ra nó và với sự phân bổ bộ nhớ bổ sung tối thiểu.
MỘT SỐ NHÂN VIÊN ĐỂ ĐƯỢC TƯ VẤN
- Bạn chỉ nên đi cho nó nếu bạn thực sự biết những gì bạn đang làm khi xử lý các tài liệu tham khảo . Giải pháp này được dành cho mục đích cụ thể của câu hỏi được thực hiện, mà nó hoạt động khá tốt . Để sử dụng nó trong bất kỳ bối cảnh nào khác có thể dẫn đến hành vi không mong muốn nếu bạn không chắc chắn về cách thức tham chiếu hoạt động.
- Trong ví dụ này, AB không cung cấp toán tử truy cập không const ([]). Vui lòng bao gồm nó, nhưng hãy nhớ: vì AB chứa các tham chiếu, để gán cho nó các giá trị cũng sẽ ảnh hưởng đến các phần tử gốc trong A và / hoặc B. Đây có phải là một tính năng mong muốn hay không, đó là một câu hỏi dành riêng cho ứng dụng Xem xét cẩn thận.
- Mọi thay đổi được thực hiện trực tiếp cho A hoặc B (như gán giá trị, sắp xếp, v.v.) cũng sẽ "sửa đổi" AB. Điều này không hẳn là xấu (thực ra, nó có thể rất tiện dụng: AB không bao giờ cần phải cập nhật rõ ràng để giữ cho nó được đồng bộ hóa với cả A và B), nhưng đó chắc chắn là một hành vi người ta phải nhận thức được. Ngoại lệ quan trọng: để thay đổi kích thước A và / hoặc B thành sth lớn hơn có thể khiến chúng được phân bổ lại trong bộ nhớ (đối với nhu cầu không gian liền kề) và điều này sẽ vô hiệu hóa AB.
- Bởi vì mọi quyền truy cập vào một phần tử đều được kiểm tra trước (cụ thể là "i <v1.size ()"), thời gian truy cập VecProxy, mặc dù không đổi, cũng chậm hơn một chút so với vectơ.
- Cách tiếp cận này có thể được khái quát cho n vectơ. Tôi đã không thử, nhưng nó không phải là một vấn đề lớn.