[英]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.