2013-07-29 35 views
1

我正在閱讀有關ostream的迭代器(迭代器適配器)以及作者給出了下面的例子:爲什麼我們增加在這裏的ostream迭代

/* Declare an ostream_iterator that writes ints to cout. */ 
ostream_iterator<int> myItr(cout, " "); 
/* Write values to the iterator. These values will be printed to cout. */ 
*myItr = 137; // Prints 137 to cout 
++myItr; 
*myItr = 42; // Prints 42 to cout 
++myItr 

我很好奇,爲什麼示例執行++ myItr在給它賦值之後?

+0

你問這是因爲你碰巧知道,在這種特殊情況下,增量操作實際上是沒有操作?還是你一般不熟悉迭代器,這種語法對你來說完全陌生?如果是後者,dasblinkenlight有答案。如果是前者,那麼它是爲了與其他迭代器類型保持一致,其中操作不是無操作。 –

回答

3

迭代器在指針之後建模;這包括輸出迭代器。當您將數據複製到指針指向的區域時,您可以取消引用指針,進行賦值,然後增加指針。你對迭代器也是這樣,包括這些輸出變種*

習慣上的增量與分配相結合,這樣的:

*myItr++ = 137; // Prints 137 to cout 
*myItr++ = 42; // Prints 42 to cout 

當一個迭代器預計將被分配和增加,你可以混合和匹配迭代器和算法希望他們。例如,您可以通過調用std::copy來執行容器的打印 - 您可以使用相同的算法將一個容器複製到另一個容器,將容器複製到數組中或從數組中填充容器。


*值得注意的是, ++的兩個過載都不會對 ostream_iterator做任何事情。它們包含在內以滿足 OutputIterator的要求。有關更多詳細信息,請參閱 this link

+0

感謝您的答案,你可以解釋爲什麼需要增加指針是必要的嗎?如果你不這樣怎麼辦? – MistyD

+1

@MistyD當你確定迭代器是輸出類型的時候,增量是沒有必要的,因爲它是無操作的。只有當你編寫一個期望任何類型的迭代器的算法時纔有必要。 – dasblinkenlight

+0

可能存在輸出迭代器的實例,其增量是顯着的,原始指針是顯而易見的例子,儘管在許多情況下,增量操作不會像'ostream_iterator'那樣執行任何操作。 – Casey

相關問題