[英]PART 2 : Why do I need a Forward Iterator to implement my customized std::search
[英]Why do I need another iterator as an argument in std::copy()?
我不明白為什么我需要在調用std::copy()
將另一個迭代器作為第二個參數來讀取文件。 迭代器“結束”文件的結尾怎么樣?
vector<Point> v;
istream_iterator<Point> is(file), end;
copy(is, end, back_inserter(v));
迭代器“結束”文件的結尾怎么樣?
按照慣例和/或標准庫中的設計決定。 迭代器end
是默認構造的,在cppreference上 ,我們了解了默認的std:istream_iterator
構造函數:
constexpr istream_iterator();
構造流末端迭代器,對存儲值進行值初始化[...]
更深層次的推理是標准算法是圍繞半開放范圍的概念構建的,通常表示為[first, last)
。 該is
迭代器必須從某種結束標記來區分last
-否則, std::copy
可以不知道什么時候從輸入讀書是沒有意義的了(即,當它到達文件的末尾)。 在你的情況下,這是end
。
為什么?
你需要以某種方式告訴算法應該復制多少元素。 請注意, copy
是通用的,使用迭代器的原因是與實際容器無關。 因此,當算法到達容器的末尾時,該算法無法停止。 它只是你傳遞它的兩個迭代器。
怎么樣?
這就是它在語言中的定義方式。 如果你看一下不帶參數的構造函數,你會發現它創建了一個特殊的end-of-stream迭代器。 從cppreference :
constexpr istream_iterator(); (1)
1)構造流結束迭代器,對存儲值進行值初始化。 如果定義auto x = T()中的初始值設定項,則此構造函數為constexpr; 是一個常量初始化器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.