我刚开始看这个并遇到像
这样的例子double value1, value2;
std::istream_iterator<double> eos; // end-of-stream iterator
std::istream_iterator<double> iit (std::cin); // stdin iterator
if (iit!=eos) value1=*iit;
++iit;
所以我想任何拥有广泛OO背景但不是最近C的人我都认为WTF!人们期望看到类似
的东西while (iit.next()) ... iit.value()
但是我可以理解,对于一个C程序员来说,做指针运算感觉就像是一种思考迭代器(!!)的自然方式。
所以像*这样的运算符可以被覆盖来完成不同的事情。但是!=运算符是做什么的?文件说这个不会以某种奇怪的方式被覆盖。那怎么可能有用呢?
从C的角度来看,这可能就像在字符串中查找那个可爱的尾随null一样。但是在这里我不希望有一些用作令牌的魔法双值。它是否使用NaN或其他东西?
答案 0 :(得分:2)
说你有:
int arr[10];
在C中,要迭代数组,最常用的方法是:
for ( int i = 0; i < 10; ++i )
{
doSomething(arr[i]);
}
你也可以在C ++中做到这一点。但是,C ++编程习惯已经发展到使用更自然的地方:
int* end = arr + 10;
for ( int* iter = arr; iter != end; ++iter )
{
doSomething(*iter);
}
您可以使用该惯用法迭代容器,例如std::vector
,std::set
,std::map
等。
std::map<int, int> aMap = { ... };
std::map<int, int>::iterator end = aMap.end();
for ( std::map<int, int>::iterator iter = aMap.begin(); iter != end; ++iter )
{
int key = iter->first;
int value = iter->second;
// Use key and value
}
Standard Algorithms Library中的大多数(如果不是全部)函数都设计为使用 iterator 的概念。
如果您有权访问C ++ 11编译器,可以使用新范围 - for
循环,auto
关键字来推断变量类型,std::begin()
和{{ 1}},上面的代码块可以进一步简化。
对于数组:
std::end()
或
for ( auto val : arr )
{
doSomething(val);
}
对于auto end = std::end(arr);
for ( auto iter = std::begin(arr); iter != std::end; ++iter )
{
doSomething(*iter);
}
:
std::map
或
for ( auto& item : aMap )
{
int key = item.first;
int value = item.second;
// Use key and value
}
或
auto end = std::end(aMap);
for ( auto iter = std::begin(aMap); iter != end; ++iter )
{
int key = iter->first;
int value = iter->second;
// Use key and value
}
根据您的具体问题,std::istream_iterator<double>
以非常类似的方式使用。它可用于从auto end = aMap.end();
for ( auto iter = aMap.begin(); iter != end; ++iter )
{
int key = iter->first;
int value = iter->second;
// Use key and value
}
读取数据,数据可用于各种算法。其重要成员函数的几个是operator*
and operator->
overloads。当调用这些函数时,迭代器从其关联的std::istream
中读取一个类型为double
的对象并返回数据。因此,您可以在std::istream
循环中使用它:
for