簡體   English   中英

為什么我需要另一個迭代器作為std :: copy()中的參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM