繁体   English   中英

C ++迭代器,!=到底是什么意思?

[英]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::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
}

标准算法库中的大多数(如果不是全部)功能都旨在与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM