C ++迭代器,做什么!=真的是什么意思?

时间:2015-10-31 05:49:16

标签: c++ stl

我刚开始看这个并遇到像

这样的例子
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或其他东西?

1 个答案:

答案 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::vectorstd::setstd::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