[英]C++ Iterators, what does != really mean?
我刚开始看这个,遇到了类似的例子
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;
因此,我想像具有广泛面向对象背景但没有最近的CI的任何人都认为WTF! 人们期望看到类似的东西
while (iit.next()) ... iit.value()
但是我可以理解,对于C程序员来说,执行指针算术就像是考虑迭代器(!!)的自然方法。
因此,可以忽略*之类的运算符来执行完全不同的操作。 但是!=运算符的作用是什么? Docs说,这并没有以某种怪异的方式被覆盖。 那么它怎么可能工作呢?
从C的角度来看,这就像遍历字符串以寻找可爱的尾随null一样。 但是在这里,我不希望有一些不可思议的double值用作令牌。 它使用NaN还是什么?
说您有:
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
}
标准算法库中的大多数(如果不是全部)功能都旨在与iterator的概念配合使用。
如果可以访问C ++ 11编译器,则可以使用新的range- for
循环, auto
关键字来推断变量类型以及上述代码段的std::begin()
和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
}
要么
auto end = aMap.end();
for ( auto iter = aMap.begin(); iter != end; ++iter )
{
int key = iter->first;
int value = iter->second;
// Use key and value
}
谈到您的特定问题, std::istream_iterator<double>
的使用方式非常相似。 它可以用于从std::istream
读取数据,并且可以在各种算法中使用该数据。 它的两个重要成员函数是operator*
和operator->
重载 。 调用这些函数时,迭代器从与其关联的std::istream
读取类型为double
一个对象并返回数据。 因此,可以在for
循环中使用它,如下所示:
std::istream_iterator<double> iter(std::cin);
std::istream_iterator<double> end;
for ( ; iter != end; ++iter )
{
double val = *iter;
std::cout << "Got " << val << std::endl;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.