C++ iostream迭代器是如何工作的?

C++ iostream迭代器是如何工作的?,c++,c++11,iterator,iostream,C++,C++11,Iterator,Iostream,从标准模板库中,我了解了istream和ostream迭代器。我不明白它们是怎么工作的 我也不明白为什么要用它们。为什么它们有用?流迭代器为iostreams的格式化提取/插入操作提供迭代器接口。例如,考虑以下内容: std::vector<int> v; for (int n; std::cin >> n; ) v.push_back(n); 输出流迭代器在分配给时执行其工作;其他行动都不是行动 有趣的是,没有一个流迭代器包装getline;人们通常自己编

从标准模板库中,我了解了
istream
ostream
迭代器。我不明白它们是怎么工作的


我也不明白为什么要用它们。为什么它们有用?

流迭代器为iostreams的格式化提取/插入操作提供迭代器接口。例如,考虑以下内容:

std::vector<int> v;

for (int n; std::cin >> n; )
    v.push_back(n);
输出流迭代器在分配给时执行其工作;其他行动都不是行动



有趣的是,没有一个流迭代器包装
getline
;人们通常自己编写一个,因为迭代器接口在许多方面都很有用。

流迭代器允许您将流用作某种源或目标,例如期望使用输入或输出迭代器的算法

它们主要用于为基本功能提供统一的接口,因此您不需要(例如)在内存中的某个集合中创建中间结果,然后将数据从该集合复制到输出文件(以及输入)

就其工作方式而言,istream_迭代器通常在内部存储一个T对象。当您创建迭代器时,它使用
stream>>值从文件中读取(或尝试读取)一个T<代码>运算符*
允许您访问该值<代码>运算符+读取下一个值


类似地,当您分配项时,ostream_迭代器会将其写入文件。由于流自动前进,
operator++
通常不做任何事情(除了返回对迭代器的引用)。如果你真的想深入研究细节(比如它们),你可以看看我不久前发布的文章。

作为一个例子来说明Kerrek和Jerry已经说过的话:

而不是写这样的东西:

std::vector<int> vInts;
int n;
while (fin >> n) // where fin is an open ifstream
    vInts.push_back(n);
// ...
for (int i = 0; i < vInts.size(); ++i)
    cout << vInts[i] << endl;

这避免了临时存储和潜在的循环条件缺陷(例如,如果你要编写
,实际上流迭代器本身并没有用处。在迭代器上运行一组算法会使它们变得有用。

难道不是算法本身没有用处,但只有当你有一组迭代器来工作时,它们才会变得有用吗?这有点像鸡蛋一样。@Ker)rekSB或者那样,当然(但是算法使用迭代器的概念)@ZacHowland幸运的是,在算法到来之前,鸡蛋已经从鸡身上孵化出来了:指针在算法中很容易使用,即使没有算法,它们也很有用。@DietmarKühl是和否。对于不涉及某些处理的指针,你会做什么有用的操作(也称为算法)?;)+1问题不在于此,而在于提出插入和流迭代器想法的天才。它真的非常聪明。
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));
std::vector<int> vInts;
int n;
while (fin >> n) // where fin is an open ifstream
    vInts.push_back(n);
// ...
for (int i = 0; i < vInts.size(); ++i)
    cout << vInts[i] << endl;
copy(istream_iterator<int>(fin), istream_iterator<int>(), ostream_iterator<int>(cout, "\n"));