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

标签 c++ stl iterator

对于诸如从 std::back_inserter() 返回的那些迭代器,有什么东西可以用作“结束”迭代器吗?

起初这似乎有点荒谬,但我有一个 API 是:

template<typename InputIterator, typename OutputIterator>
void foo(
    InputIterator input_begin,
    InputIterator input_end,
    OutputIterator output_begin,
    OutputIterator output_end
);

foo 对输入序列执行一些操作,生成输出序列。 (foo 知道谁的长度,但可能等于也可能不等于输入序列的长度。)

采用 output_end 参数是奇怪的部分:例如,std::copy 不会这样做,并假设您不会通过它垃圾。 foo 这样做是为了提供范围检查:如果传递的范围太小,它会以防御性编程的名义抛出异常。 (而不是潜在地覆盖内存中的随机位。)

现在,假设我想向 foo 传递一个后插入器,特别是来自 std::vector 的插入器,它在内存限制之外没有限制。我仍然需要一个“结束”迭代器——在这种情况下,它永远不会比较相等。 (或者,如果我有一个 std::vector 但对长度有限制,也许它有时会比较相等?)

我该怎么做呢?我确实有能力更改 foo 的 API - 最好不要检查范围,而是提供替代方法来获得所需的输出范围吗? (无论如何,原始数组都需要它,但 vector 中的反向插入器则不需要。)这看起来不太健壮,但我正在努力使“健壮”(以上)工作。

最佳答案

如果 foo 检查以确保 distance(output_begin, output_end) 足够大以包含结果,您可以使用什么作为“结束”迭代器? back_inserter 将元素添加到末尾;根据定义,back_inserter 添加元素的位置与序列末尾之间的距离0

foostd::copy 类似的签名 foo(InIt, InIt, OutIt) 在我看来是你的最好的选择。它并不是真的“不稳健”。对于大多数算法,出于性能原因,您只想在调试版本中执行这种范围检查,并且一个体面的标准库实现(如 Visual C++ 标准库)已经在调试版本中提供了大量范围检查。

或者,您可以创建一个 back_inserting_foo(InIt, InIt, Container),尽管为此创建一个特殊情况有点不寻常,并且会给函数的用户带来更大的负担以了解哪个重载它们需要用于不同类型的迭代器。

关于c++ - "end()"后插入器的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573496/

相关文章:

c++ - 如何在 visual studio 中显示模板的静态类成员?

c++ - 模板特化 : Is not a Template

c++ - 什么时候停止读取文件?

c++ - 制作不存储 value_type 的 InputIterator

java - 在java中获取Linkedhashmap中的Next key

c++ - 错误] ISO C++ 禁止指针和整数之间的比较 [-fpermissive]

c++ - 使用 C/C++ 自动化 Internet Explorer

c++ - 推回行为

c++ - std::max_element() 有多聪明?

rust - 如何让迭代器链执行for_each()并返回一个计数?