簡體   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