对于返回的迭代器std::back_inserter(),有什么东西可以用作"结束"迭代器吗?
这看起来有点荒谬,但我有一个API,它是:
template<typename InputIterator, typename OutputIterator>
void foo(
InputIterator input_begin,
InputIterator input_end,
OutputIterator output_begin,
OutputIterator output_end
);
Run Code Online (Sandbox Code Playgroud)
foo对输入序列执行一些操作,生成输出序列.(已知谁的长度,foo但可能或可能不等于输入序列的长度.)
获取output_end参数是奇怪的部分:std::copy例如,不执行此操作,并假设您不会将其传递给垃圾.foo它是否提供范围检查:如果你传递的范围太小,它会以防御性编程的名义抛出一个异常.(而不是潜在地覆盖内存中的随机位.)
现在,假设我想传递foo一个后插入器,特别是一个std::vector在内存限制之外没有限制的插入器.我仍然需要一个"结束"迭代器 - 在这种情况下,一些永远不会比较平等的东西.(或者,如果我有一个std::vector但有长度限制,也许它可能有时比较相等?)
我该怎么做呢?我确实有能力改变fooAPI - 最好不检查范围,而是提供另一种方法来获得所需的输出范围?(对于原始数组而言,无论如何都需要这样,但后向插入器不需要进入矢量.)这看起来不太稳健,但我正在努力使"强大"(上图)工作.
如果foo要检查以确保distance(output_begin, output_end)足够大以包含结果,您可以使用什么作为"结束"迭代器?A back_inserter添加元素到最后; 该distance在哪个地方之间back_inserter增加了元件和序列的结束是根据定义,0.
在我看来,foo具有std::copy类似签名的A foo(InIt, InIt, OutIt)是您的最佳选择.它实际上并不"不健全".对于大多数算法,出于性能原因,您只想在调试版本中进行此类范围检查,并且一个像样的标准库实现(如Visual C++标准库)已经在调试版本中提供了大量的范围检查.
或者,你可以创建一个back_inserting_foo(InIt, InIt, Container),虽然为此创建一个特殊情况会有点不寻常,并且会给函数用户带来更大的负担,以便知道他们需要为不同类型的迭代器使用哪个重载.
| 归档时间: |
|
| 查看次数: |
773 次 |
| 最近记录: |