2016-02-06 70 views
2

我读C++ Standard(节输入迭代),我有硬时间以显现在粗体文本:C++输入迭代

注:对于输入的迭代器,一个== B不意味着+ + a == ++ b。 (相等不保证替换 属性或引用透明度。)输入迭代器的算法不应该尝试通过 两次通过相同的迭代器。它们应该是单通道算法。

我明白输入迭代器是单遍,但我似乎无法用C++代码将其可视化。有人能告诉我如何使迭代器成为一个单一的例子吗?

+0

你是什么意思的“如何使迭代器成为一次通过”?他们为什么一次通过?或者如何使用这种迭代器? –

+0

我不确定你在问什么。迭代器就是它们;他们不会“变成”任何东西。你是否要求一个不是multipass的迭代器的例子?如果是这样,请考虑从stdin中读取的文件。 –

+0

@Revolver_Ocelot对不清楚,我想从头开始创建输入迭代器(不使用STL或boost)来学习。我只是不知道如何让我的输入迭代器类成为单通(强制单通)?在我的理解中,它是底层容器或流('stdin')的一个工作,它将迭代器作为输入或前向迭代器,对吗? – Orion

回答

2

假设您想从标准输入中读取整数。这样做的一个方法就是使用

#include <iterator> 
#include <iostream> 
#include <vector> 

using namespace std; 

const vector<int> v{istream_iterator<int>{cin}, istream_iterator<int>{}}; 

这将读取到的整数v(见istream_iterator)。

在这种情况下,迭代器将会是单次传递很有意义,因为范围是刚刚创建的事情,因为用户键入事物,并且每个元素都被消耗并消失。你不能重申这个范围。


除此之外,没有那么一定要通过

的意思如何使迭代器成为一个单一的通?

  • 如果你的意思是“如何以表示你正在写一个迭代器类有这个限制?”,然后将其iterator_categoryinput_iterator_tag

    struct my_iterator 
    { 
        using iterator_category = input_iterator_tag; 
    }; 
    
  • 如果您想查询(在编译时)迭代器类是否有此限制,请使用iterator_traits

+0

转发迭代器是多通道的,你是否指'input_iterator_tag'? –

+0

@ M.M我需要多次感谢您提供有用的评论。非常感谢! –

+0

@AmiTavory对不起,我想从头开始创建输入迭代器(不使用STL或增强)进行学习。我只是不知道如何让我的输入迭代器类成为单通(强制单通)?在我的理解中,它是底层容器或流('stdin')的一个工作,它将迭代器作为输入或前向迭代器,对吗? – Orion