Theo hiểu biết của tôi, hệ thống phân cấp các loại iterator đi như thế này:Các trình vòng lặp đầu vào có thể được sử dụng khi các trình vòng lặp chuyển tiếp dự kiến không?
Random access -> Bi-directional -> Forward -> Input
-> Output
có đúng không?
Tôi luôn nghĩ rằng có một quy tắc, nếu thuật toán mong đợi một loại trình vòng lặp cụ thể, bạn có thể cung cấp trình vòng lặp của các danh mục lên chuỗi, nhưng không phải xuống. Vì vậy, tôi đã đọc this answer, trong đó ildjarn
gợi ý
được đề xuất (sau đó tự sửa lại) bằng cách sử dụng std::ifstream
với std::istream_iterator
và std::search
để tìm dữ liệu trong một tệp. Tôi đã về để bình luận rằng bạn không thể làm điều đó, bởi vì search
dự kiến lặp đi lặp lại, và istream_iterator
là một vòng lặp đầu vào. Nhưng chỉ để chắc chắn, tôi đã thử điều này:
std::istringstream iss("Elephant hats for sale.");
std::istream_iterator<char> begin(iss), end;
std::string sub("hat");
auto i = std::search(begin, end, sub.begin(), sub.end());
Tôi không mong đợi nó biên dịch, nhưng nó đã làm. Tuy nhiên, kết quả dường như vô dụng bởi vì nếu tôi theo dõi nó với điều này:
while(i != end)
{
std::cout << *i;
++i;
}
Không có đầu ra. Vì vậy, câu hỏi của tôi là: Trình biên dịch của tôi có lỗi khi cho phép cuộc gọi của tôi đến search
sử dụng istream_iterator
không? Hay không có quy tắc nào ngăn cản việc này?
Vì lỗi lầm rõ ràng của tôi; -] Tôi đã cập nhật câu trả lời của mình bằng các liên kết đến trình bao bọc (từ Boost.Spirit) cho các trình lặp đầu vào làm cho chúng thích hợp để sử dụng như các trình vòng lặp chuyển tiếp. – ildjarn