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
.
提及
OutputIterator
是任何 class 或者只是一种指示可以输出某些内容的迭代器的方法?
OutputIterator
是否与 ostream_iterator 有某种关联?
- 为什么它提到 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_if
的 cppreference.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
。这就是为什么它说 ++
是空话。没有办法推进它。
在 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
.
OutputIterator
是任何 class 或者只是一种指示可以输出某些内容的迭代器的方法?OutputIterator
是否与 ostream_iterator 有某种关联?- 为什么它提到 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_if
的 cppreference.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
。这就是为什么它说 ++
是空话。没有办法推进它。