2011-08-15 65 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。 –

相关问题