stl style algorithm:如何管理输出迭代器

时间:2015-03-29 16:42:04

标签: c++ stl iterator stl-algorithm

如果我需要在stl样式中编写一些算法,原型就像:

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

看起来类似于例如的std ::复制

关于输出迭代器的问题, 这是否意味着调用者代码应该分配足够的容量? 和算法只使用++输出?没有任何检查。 或者算法应该添加新元素?如何?

2 个答案:

答案 0 :(得分:1)

如果算法只获得输出迭代器类型,它就不能用它做很多事情,因为输出迭代器甚至不能比较相等。可能你的意思是这样的界面:

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

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

但是,请注意,通常需要返回输出迭代器以指示对象的写入停止位置。

答案 1 :(得分:0)

这取决于您对图书馆的合同。在任何一种情况下,调用者都必须了解内存含义,抛出行为,错误情况。我建议在你的文档中明确指出,前提是 out 指向至少距离(end-begin)元素的开头。元素可能不一定处于有效状态。 这背后的原因是:

  1. 调用者已经知道他们需要多少内存,因为你提到你的算法将类似于copy。
  2. 让调用者负责分配内存有助于他们更灵活地分配他们想要的内存。在为对象分配内存时,它们可能需要调整和优化。如果您确定您的函数分配了内存,那么您还需要为分配器提供一个额外的参数。
  3. 简化您的职能。你不必担心内存不足的情况,你的功能可以专注于它的算法。