2011-08-15 109 views
2

std::generate返回void爲什麼std ::生成的返回狀態與std :: for_each類似?

template<typename ForwardIterator, typename Generator> 
void generate(ForwardIterator first, ForwardIterator last, Generator gen); 

雖然std::for_each回報Function

template<typename InputIterator, typename Function> 
Function for_each(InputIterator first, InputIterator last, Function f); 

SGI的documentation表明for_each的結果是返回可能在算法中已經變異的任何狀態很有用。 generate不一樣嗎?這是一個疏忽嗎?還是有一個界面差異的基本原理?

+0

'for_each'能夠「讀取」容器的內容。 'generate'只是覆蓋內容;返回任何東西會有什麼好處? –

+0

假設我傳遞了一個隨機數生成器來生成。返回RNG的狀態將會很有用。 –

+2

是的。但是這將是容器內容的不變。 –

回答

3

一個顯著不同的是,雖然for_each在容器的內容進行操作,generate簡單的覆蓋它。所以傳遞給generate的函數對象不能收集關於容器內容的信息,所以之後沒有什麼理由返回它(它的最終狀態是容器內容不變)。

0

我懷疑它是允許在generate的工作中複製謂詞,所以保持內部狀態並不總是正確。 for_each實際上只會變換謂詞的一個實例,然後返回它的一個副本。

當你通常做的是讓謂詞存儲一個對外部狀態對象的引用,然後檢查當生成完成時。

StateHolder state; 
Generator generator(state); // Pass by reference. 
std::generate(c.begin(), c.end(), generator); 
// Now you can check the state object for whatever you need. 
+1

謂詞不能隨意複製;請參閱Dr. Dobbs的這篇文章:http://drdobbs.com/184403769。 –

相關問題