"end()"后插入器的迭代器?

Tha*_*tos 5 c++ iterator stl

对于返回的迭代器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 - 最好不检查范围,而是提供另一种方法来获得所需的输出范围?(对于原始数组而言,无论如何都需要这样,但后向插入器不需要进入矢量.)这看起来不太稳健,但我正在努力使"强大"(上图)工作.

Jam*_*lis 5

如果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),虽然为此创建一个特殊情况会有点不寻常,并且会给函数用户带来更大的负担,以便知道他们需要为不同类型的迭代器使用哪个重载.