Tôi có một lớp X, mà tôi cung cấp một đoạn ở đây:concatenating C++ iterator dao vào một biến thành viên vector const lúc xây dựng
class X {
public:
template <typename Iter>
X(Iter begin, Iter end) : mVec(begin, end) {}
private:
vector<Y> const mVec;
};
bây giờ tôi muốn thêm một constructor concatenating mới vào lớp này, một cái gì đó như:
template <typename Iter1, typename Iter2>
X(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2) : mVec(???) { ??? }
Nhà xây dựng như vậy sẽ bắt chước hai dãy [begin1, end1) và [begin2, end2) vào mVec. Những thách thức là
1) Tôi muốn giữ gìn const trên mVec, do đó nó được coi là không đổi trong suốt các phương pháp khác của X.
2) Tôi muốn tránh bản sao không cần thiết nếu có thể. Đó là, một giải pháp là phải có một phương pháp tĩnh mà xây dựng một tổ chức phi const tạm thời để khoảng 1, chèn khoảng 2 và trả về nó, và sau đó xác định các nhà xây dựng concatenating để
template <typename Iter1, typename Iter2>
X(Iter1 begin1, Iter1 end1, Iter2 begin2, Iter2 end2)
: mVec(concatenate(begin1, end1, begin2, end2)) { }
nhưng điều đó copy tất cả các giá trị tại ít nhất một lần nữa, tôi tin.
+1 cho giải pháp thông minh ... một vòng lặp trải dài hai dãy vòng lặp ... đẹp – veefu
Nó sẽ dễ viết hơn bằng cách sử dụng boost :: iterator_facade, nhưng đây có lẽ là đặt cược tốt nhất trong trường hợp này. Ít nhất, cho đến khi chúng tôi có hỗ trợ di chuyển. – Macke
Không thấy nhu cầu concat_end. Bạn có thể so sánh trình lặp được tạo với kiểu T2 của giá trị e2 ang sinh ra một bool. –