OutputIterator 与 std::back_inserter 和 std::ostream_iterator 有何关系?

How is OutputIterator related to std::back_inserter and std::ostream_iterator?

here 查看 std::copy_if 详细信息时,第三个参数是 OutputIterator

template <class InputIterator, class OutputIterator, class UnaryPredicate>
  OutputIterator copy_if (InputIterator first, InputIterator last,
                          OutputIterator result, UnaryPredicate pred);

我有下面的代码,它使用 std::back_inserter 作为第三个参数。当我查看 std::back_inserter 详细信息 here 时,它并没有将其作为 OutputIterator.

提及
  1. OutputIterator 是任何 class 或者只是一种指示可以输出某些内容的迭代器的方法?
  2. OutputIterator 是否与 ostream_iterator 有某种关联?
  3. 为什么它提到 here 增加 std::ostream_iterator 是一个空操作。这是什么意思?这是否意味着我们不能在 std::ostream_iterator 上执行 ++?
int main()
{
    std::vector<int> vec {1, 22, 3, 4, 5, 12, 14};
    std::vector<int> rvec;
    
    std::copy_if(std::begin(vec), std::end(vec), std::back_inserter(rvec), [](const int& x){ return (x % 2 == 0);})
      

}

OutputIterator 这里是模板参数的仅供说明的名称。它没有特定的功能。

不幸的是,链接站点没有指定允许哪些类型作为 OutputIterator 的模板参数。如果你取而代之,例如std::copy_ifcppreference.com 页面,您会看到它指定类型必须是 LegacyOutputIterator(又名 输出迭代器).

这是一个描述特定要求的术语,该类型必须满足才能与 std::copy_if 一起使用。

输出迭代器类型只是一种允许写入解引用迭代器的迭代器类型。 有关详细信息,请参阅 https://en.cppreference.com/w/cpp/named_req/OutputIterator


在您为 std::back_inserter 链接的页面上,它说它是一个返回 std::back_insert_iterator 的函数。当您在 std::copy_if 的参数列表中使用 std::back_inserter(...) 时,您传递的是这个返回的对象,而不是 std::back_inserter 本身。

如果您在链接页面上单击该类型的名称,您将看到它指定 std::back_insert_iterator 是一个 LegacyOutputIterator.

因此,允许在std::copy_if中使用。


std::ostream_iterator 也是一个输出迭代器,因此可用于 std::copy_if。它仅用于“迭代”和写入 std::ostream 流。它与 std::back_inserter 无关。它也与 std::vector 无关,您没有在您的示例中使用它。

这里的“迭代”不太正确,因为它并没有真正迭代任何东西。当写入取消引用的 std::ostream_iterator 时,它只是将值输出到关联的 std::ostream。这就是为什么它说 ++ 是空话。没有办法推进它。