在什么情况下应该使用ostream_iterator增量?

时间:2011-01-16 04:59:21

标签: c++ stl iterator

std::istream_iterator<std::string> ist(std::cin);
std::istream_iterator<std::string> eof;
std::vector<std::string> str_vec(ist, eof);
std::ofstream ofs("a");
if (!ofs) {
    throw std::runtime_error("Open file failed.");
}
std::ostream_iterator<std::string> ost(ofs, "\n");
for (size_t index = 0; index != str_vec.size(); ++index) {
    //*ost = str_vec[index];
    *ost++ = str_vec[index];
}

无论我使用* ost ++,我都得到了相同的结果。我知道istream_iterator增量的含义。但在什么情况下应该使用ostream_iterator增量?

谢谢!

3 个答案:

答案 0 :(得分:2)

增量运算符很可能是ostream_iterator的无操作,但它必须为运算符提供满足输出迭代器的要求。例如,指针是有效的输出迭代器,必须递增。

答案 1 :(得分:2)

进一步的实验可能表明您甚至不需要取消引用迭代器来使其工作。 :)

ost = str_vec[index];

所有这些无操作方法都必须为流迭代器提供与其他迭代器类似的接口。

您可以使用std::copy算法,而不是手动循环。 (因为几乎所有的ostream_iterator都是有用的,这种方式可以回答你的问题:你根本不需要在你自己的代码中搞乱这些迭代器!)

 std::copy(str_vec.begin(), str_vec.end(), std::ostream_iterator<std::string>(ofs, "\n"));

考虑如何编写复制功能模板,可能会清楚需要增量和解除引用的位置:

template <class InIter, class OutIter>
void copy(InIter begin, InIter end, OutIter result)
{
    for (InIter it = begin; it != end; ++it)
        *result++ = *it;  // <-- here, result might be almost any kind of iterator
} 

答案 2 :(得分:1)

您的算法不应该递增“ostream迭代器”。它应该递增输出迭代器。因此,如果要输出后续元素,请始终递增输出迭代器。这样,您的算法将支持std::ostream_iterator以及std::vector<T>::iteratorT*指针。 std::ostream_iterator增量可能是无操作,但不一定是其他输出迭代器的情况。