【问题标题】:stl style algorithm: how to manage output iteratorstl 风格算法:如何管理输出迭代器
【发布时间】:2015-03-29 16:42:03
【问题描述】:

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

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

看起来类似于例如标准::复制

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

【问题讨论】:

  • 我认为您的算法应该注意输出迭代器所需的分配。至少,IMO,这是最直观的方式。
  • STL 风格的算法通常不能分配新的序列元素,也不能进行任何边界检查(专门的迭代器可以)。

标签: c++ stl iterator stl-algorithm


【解决方案1】:

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

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

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

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

【讨论】:

  • 你是对的,输出类型应该符合OutputIterator的概念,应该作为第二个模板参数添加
【解决方案2】:

这取决于您想要的图书馆合同。在任何一种情况下,您的调用者都必须了解内存影响、抛出行为、错误场景。我建议在您的文档中明确说明,前提条件是 out 指向至少距离(结束 - 开始)元素的开始。元素可能不一定处于有效状态。 这背后的原因是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多