C++ 如何绕过输出迭代器上的迭代?

C++ 如何绕过输出迭代器上的迭代?,c++,iterator,C++,Iterator,我在下面实现的算法是著名的Robert Floyd算法,它从总共N个数的数组中返回M个随机数。该算法返回一组元素,但在该算法中,您需要循环该结果集,以检查之前找到的元素是否已添加到结果集中 不可能在输出迭代器上循环,因为它在文档中声明输出迭代器只应被解引用一次 模板 Iter随机单元(Iter开始、Iter结束、随机发生器和g){ 如果(开始==结束)返回开始; 标准:均匀分布(0,标准:距离(起点、终点)-1); std::前进(开始,dis(g)); 返回启动; } 模板 Iter随机单元(

我在下面实现的算法是著名的Robert Floyd算法,它从总共N个数的数组中返回M个随机数。该算法返回一组元素,但在该算法中,您需要循环该结果集,以检查之前找到的元素是否已添加到结果集中

不可能在输出迭代器上循环,因为它在文档中声明输出迭代器只应被解引用一次

模板
Iter随机单元(Iter开始、Iter结束、随机发生器和g){
如果(开始==结束)返回开始;
标准:均匀分布(0,标准:距离(起点、终点)-1);
std::前进(开始,dis(g));
返回启动;
}
模板
Iter随机单元(Iter开始、Iter结束){
静态std::随机_设备rd;
静态标准::mt19937 gen(rd());
返回随机_元素(开始、结束、生成);
}
//! @罗伯特·弗洛伊德的简要算法。
模板
输出迭代器随机(先输入迭代器,后输入迭代器,输出迭代器结果,大小\u t编号){
//“误用”glibc功能以强制执行符合文档要求的概念
typedef typename std::iterator_traits::value_type ValueType;
__glibcxx_函数_requires(_InputIteratorConcept);
__glibcxx_函数_需要(_OutputIteratorConcept);
__glibcxx\u需要\u有效\u范围(first1,last1);
if(first==last)返回结果;
if(number==0)返回结果;

断言(数字您可以收紧算法的要求,并需要一个
前向迭代器
来指向输出。

您可以收紧算法的要求,并需要一个
前向迭代器
来指向输出。

您的函数可以做任何它想做的事情。然后您需要向用户指定模板的方式使用的参数不一致

名称
OutputIterator
只是一个标识符;它没有引入标准中的任何限制或功能。它是一种文档形式,因此如果您再次使用迭代器作为输入,
OutputIterator
将是一个误导性名称

根据标准,
ForwardIterator
需要多通道保证,即您可以保留迭代器的前一个值并多次读取其引用的对象,并且仍然获得相同的值,而且底层序列仍然存在。所有这些对于您的目的来说似乎都是必要和足够的。所以u可能调用模板参数<代码>转发迭代器< /C>。但是它仍然只是一个名称。直到实现更严格的系统,C++模板才使用。
该标准建议并命名某些通用接口,但一切都可以。

您的函数可以做任何它想做的事情。然后您需要向用户指定模板参数的使用方式

名称
OutputIterator
只是一个标识符;它没有引入标准中的任何限制或功能。它是一种文档形式,因此如果您再次使用迭代器作为输入,
OutputIterator
将是一个误导性名称

根据标准,
ForwardIterator
需要多通道保证,即您可以保留迭代器的前一个值并多次读取其引用的对象,并且仍然获得相同的值,而且底层序列仍然存在。所有这些对于您的目的来说似乎都是必要和足够的。所以u可能调用模板参数<代码>转发迭代器< /C>。但是它仍然只是一个名称。直到实现更严格的系统,C++模板才使用。
该标准建议并命名某些通用接口,但一切都是如此。

好的,我将明确添加限制。我的来源是,我引用:“需要输出迭代器的算法应该是单次传递输出算法:每个迭代器位置最多解引用一次。”@ondervloei cplusplus.com不是一个好的源代码。这是向后的;单通道输出算法需要一个输出计算器,而多通道算法需要(至少)ForwardIterator。除非您有需要插入函数的特定迭代器类型,否则这根本不是一个要求。好的,我将明确添加限制。我的来源是,我引用:“需要输出迭代器的算法应该是单次传递输出算法:每个迭代器位置最多解引用一次。”@ondervloei cplusplus.com不是一个好的源代码。这是向后的;单通道输出算法需要一个输出计算器,而多通道算法需要(至少)ForwardIterator。除非您有一个需要插入函数的特定迭代器类型,否则这根本不是一个要求。这是否意味着所有需要
输出迭代器的算法也可以使用
ForwardIterator
?在这种情况下,为什么我们有一个
输出迭代器,这显然是以前问过的,有5个迭代器类别:输入、输出、转发、双向、随机访问。任何随机访问迭代器也是一个双向迭代器。任何双向迭代器也是转发。任何转发也是输入和输出。它们只是要求越来越高的概念。是一个输出迭代器不是前向迭代器。这是否意味着所有需要
输出迭代器的算法也可以与
前向迭代器一起工作?在这种情况下,为什么我们有一个
输出迭代器
,随机访问。任何随机访问迭代器也是双向迭代器。任何双向迭代器也是前向的。任何前向也是输入和输出。它们只是要求越来越高的概念。是一个输出迭代器,而不是前向迭代器。事后看来