首页 > 解决方案 > 在函数中传递 ifstream 迭代器

问题描述

为什么这段代码有效?e迭代器没有点分配给任何东西。如何暗示函数会一直持续到 fstream 结束?

#include <vector>
#include <iostream>
#include <list>
#include <fstream>
#include <string>
#include <iterator>

using namespace std;

template<typename InputIterator>
void printRange(InputIterator first, InputIterator last)
{
    while (first != last)
    {
        std::cout << *first << endl;
        ++first;
    }
}
int main()
{
    vector<int> v = { 11, 24, 541 };
    printRange(v.begin(), v.end());
    cout << endl;
    list<double> lst = { 11.88, 21.4, 541.9 };
    printRange(lst.begin(), lst.end());
    cout << endl;
    ifstream ifs{ "strings.txt" };
    istream_iterator<string> i(ifs);
    istream_iterator<string> e;
    printRange(i, e);
}

字符串.txt

coding c++

标签: c++iteratordefault-constructor

解决方案


该变量e是默认构造的,因此调用了 0 参数构造函数。从文档中

constexpr istream_iterator();

构造流结束迭代器。std::is_trivially_default_constructible_v<T>如果为真,则此构造函数为 constexpr 。

因此,默认构造一个istream_iterator构造流结束迭代器,这正是您需要的值。


推荐阅读