繁体   English   中英

stl样式算法:如何管理输出迭代器

[英]stl style algorithm: how to manage output iterator

如果我需要以stl风格编写一些算法,并且原型是这样的:

template<typename RAIter>
void my_algo(RAIter begin, RAIter end, RAIter out);

看起来类似于例如std :: copy

关于输出迭代器的问题,这是否意味着调用程序代码应分配足够的容量? 和算法仅使用++ out? 没有任何检查。 还是算法应该添加新元素? 怎么样?

如果您的算法仅获得输出迭代器类型,那么它将无法做很多事情,因为输出迭代器甚至无法比较相等性。 可能您的意思是这样的接口:

template<typename RAIter, typename WIter>
WIter my_algo(RAIter begin, RAIter end, WIter out);

算法的约定应指定最多可以根据std::distance(begin, end)写入多少个元素std::distance(begin, end)并且out至少应允许分配尽可能多的值。 也就是说,算法中没有对输出迭代器的特殊处理。

但是请注意,通常必须返回输出迭代器以指示在何处停止对象写入。

这取决于您要与图书馆签订的合同。 无论哪种情况,您的调用者都必须意识到内存的含义,抛出行为和错误情况。 我建议使得它在文档中明确的前提是点至少距离(结束-开始)的开始元素。 这些元素可能不一定处于有效状态。 其背后的原因是:

  1. 调用者已经知道他们需要多少内存,因为您提到算法将类似于复制。
  2. 留给调用者分配内存的职责有助于他们给分配所需的内存更大的灵活性。 它们可能需要调整和优化,同时为对象分配内存。 如果确定函数分配了内存,则还需要为分配器提供其他参数。
  3. 简化您的职能职责。 您不必担心内存不足的情况,您的功能可以专注于它的算法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM