Có thể có ít nhất một trong các trình biến đổi std
và một số thủ thuật. std::back_insert_iterator
cần một con trỏ đến vùng chứa để gọi phương thức push_back
của nó. Hơn nữa con trỏ này chỉ là protected
.
#include <iterator>
template <typename Container>
struct get_a_pointer_iterator : std::back_insert_iterator<Container> {
typedef std::back_insert_iterator<Container> base;
get_a_pointer_iterator(Container& c) : base(c) {}
Container* getPointer(){ return base::container;}
};
#include <iostream>
int main() {
std::vector<int> x{1};
auto p = get_a_pointer_iterator<std::vector<int>>(x);
std::cout << (*p.getPointer()).at(0);
}
Đây là khóa học không sử dụng thiết thực, nhưng chỉ đơn thuần là một ví dụ về một iterator std
rằng thực sự mang một con trỏ đến thùng chứa của nó, mặc dù một trong khá đặc biệt (ví dụ. Incrementing một std::back_insert_iterator
là một noop). Toàn bộ điểm của việc sử dụng các trình vòng lặp không phải là để biết các phần tử đến từ đâu. Mặt khác, nếu bạn muốn một trình lặp cho phép bạn có được một con trỏ đến vùng chứa, bạn có thể viết một cái.
Tôi muốn biết lý do bạn muốn điều này. – chris
Điều tôi đang cố gắng làm là lưu trạng thái của trình lặp trong một số quá trình truyền tải (của một số cấu trúc dữ liệu khác) để tôi có thể tăng trình vòng lặp trong lần truy cập tiếp theo. Nếu ở trên là có thể thì tôi không phải giữ tham chiếu/con trỏ tới chính vùng chứa đó mà chỉ là con trỏ tới trình lặp đó. –