为什么在std :: copy()中需要另一个迭代器作为参数?

Sve*_*enG 5 c++ iterator stl

我不明白为什么我需要在std::copy()读取文件的调用中添加另一个迭代器作为第二个参数。文件的迭代器“结束”如何结束?

    vector<Point> v;
    istream_iterator<Point> is(file), end;
    copy(is, end, back_inserter(v));
Run Code Online (Sandbox Code Playgroud)

lub*_*bgr 2

迭代器“end”如何结束文件?

按照惯例和/或标准库中的设计决策。迭代器end是默认构造的,在cppreference上,我们了解了默认std:istream_iterator构造函数:

constexpr istream_iterator();
Run Code Online (Sandbox Code Playgroud)

构造流尾迭代器,对存储的值进行值初始化 [...]

更深层的推理是,标准算法是围绕半开范围的概念构建的,通常表示为[first, last)。迭代is器必须与某种结束哨兵区分开来last- 否则,std::copy无法知道何时从输入读取不再有意义(即何时到达文件末尾)。在你的情况下,这是end.