Đối với các trình vòng lặp như các trình lặp lại được trả về từ std::back_inserter()
, có điều gì có thể được sử dụng làm trình lặp "kết thúc" không?"end()" iterator cho bộ chèn lại?
Điều này có vẻ một chút vô nghĩa lúc đầu, nhưng tôi có một API đó là:
template<typename InputIterator, typename OutputIterator>
void foo(
InputIterator input_begin,
InputIterator input_end,
OutputIterator output_begin,
OutputIterator output_end
);
foo
thực hiện một số hoạt động trên các chuỗi đầu vào, tạo ra một chuỗi đầu ra. (Độ dài của ai được biết là foo
nhưng có thể hoặc không thể bằng với chiều dài của chuỗi đầu vào.)
Tham số output_end
là phần lẻ: std::copy
không làm điều này, ví dụ, và giả sử bạn ' sẽ không vượt qua nó rác. foo
hiện nó để cung cấp kiểm tra phạm vi: nếu bạn vượt qua một phạm vi quá nhỏ, nó ném một ngoại lệ, trong tên của chương trình phòng thủ. (Thay vì có khả năng ghi đè các bit ngẫu nhiên trong bộ nhớ.)
Bây giờ, nói rằng tôi muốn vượt qua foo
một trình rút gọn trở lại, cụ thể là từ số std::vector
không có giới hạn nào ngoài giới hạn bộ nhớ. Tôi vẫn cần một bộ lặp "kết thúc" - trong trường hợp này, cái gì đó sẽ không bao giờ so sánh bằng nhau. (Hoặc, nếu tôi có một số std::vector
nhưng có giới hạn về chiều dài, có lẽ đôi khi nó có thể so sánh bằng nhau?)
Làm cách nào để tôi thực hiện việc này? Tôi có khả năng thay đổi API của foo
- tốt hơn là không kiểm tra phạm vi và thay vào đó cung cấp phương tiện thay thế để có được phạm vi đầu ra được yêu cầu? (Mà sẽ là cần thiết anyways cho mảng thô, nhưng không cần thiết cho trở lại chèn vào một vector.) Điều này có vẻ ít mạnh mẽ, nhưng tôi đang đấu tranh để làm cho "mạnh mẽ" (ở trên) làm việc.
Đây là phương pháp hợp lý. Tôi đã không nghĩ đến việc kiểm tra xem liệu 'out_it == out_end' trong mỗi lần lặp thay vì tính toán khoảng cách. Nếu thuật toán có thể được sửa đổi sao cho hai vòng lặp đầu ra có thể có các kiểu khác nhau (sử dụng hai tham số mẫu), điều này có thể được thực hiện dễ dàng hơn bằng cách đơn giản có một trình lặp lặp lại 'back_inserter_end', khi so sánh với bất kỳ phép lặp nào không bằng nhau. Điều đó sẽ làm cho mã ít hơn nhiều nhưng có thể rối rắm hơn. Tôi vẫn không nghĩ rằng kiểm tra phạm vi như thế này là một ý tưởng tuyệt vời, nhưng nếu nó thực sự là mong muốn, đây là một cách tốt để thực hiện nó! –
@James: Bộ lặp 'back_inserter_end' có vẻ hấp dẫn ... Sẽ tốt nếu tất cả các trình lặp có giá trị" NULL "như con trỏ, vì giá trị đó có thể được sử dụng thay vì cần một kiểu riêng biệt để giữ nó. Oh well. –
Đây là tất cả các câu trả lời tuyệt vời và tôi ước tôi có thể đánh dấu "Câu trả lời được chấp nhận" trên nhiều điều. Tôi đã upvoted của bạn (mặc dù tôi muốn tôi có thể +2 nó), nhưng tôi đang cho James câu trả lời được chấp nhận vì đó là giải pháp tôi đang đi với. (điều này sẽ là một thư viện, vì vậy tôi không chắc chắn về việc phơi bày điều này trong một API bên ngoài) Điều này chắc chắn mang tính thông tin và thú vị - cảm ơn bạn đã dành thời gian để đăng nó. – Thanatos