C++ 在什么情况下应该使用ostream_迭代器增量? std::istream_迭代器ist(std::cin); std::istream_迭代器eof; std::vector str_vec(ist,eof); 标准::ofs(“a”)流; 如果(!ofs){ 抛出std::runtime_错误(“打开文件失败”); } std::ostream_迭代器ost(ofs,“\n”); 对于(size_t index=0;index!=str_vec.size();++index){ //*ost=str_vec[索引]; *ost++=str_vec[index]; }

C++ 在什么情况下应该使用ostream_迭代器增量? std::istream_迭代器ist(std::cin); std::istream_迭代器eof; std::vector str_vec(ist,eof); 标准::ofs(“a”)流; 如果(!ofs){ 抛出std::runtime_错误(“打开文件失败”); } std::ostream_迭代器ost(ofs,“\n”); 对于(size_t index=0;index!=str_vec.size();++index){ //*ost=str_vec[索引]; *ost++=str_vec[index]; },c++,stl,iterator,C++,Stl,Iterator,无论是否使用*ost++,我都得到了相同的结果。我知道istream_迭代器增量的含义。但是在什么情况下应该使用ostream_迭代器增量呢 谢谢 对于ostream\u迭代器,增量运算符很可能是不可操作的,但它必须提供满足输出迭代器要求的运算符。例如,指针是有效的输出迭代器,必须递增。您的算法不应递增“ostream迭代器”。它应该递增一个输出迭代器。因此,如果要输出后续元素,请始终递增输出迭代器。这样,您的算法将支持std::ostream\u迭代器以及std::vector::迭代器和T*

无论是否使用*ost++,我都得到了相同的结果。我知道istream_迭代器增量的含义。但是在什么情况下应该使用ostream_迭代器增量呢


谢谢

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

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

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

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

与其手动循环,不如使用
std::copy
算法。(因为这几乎就是
ostream_迭代器的优点,这类问题回答了您的问题:您根本不需要在自己的代码中使用这些迭代器!)

std::copy(str_vec.begin()、str_vec.end()、std::ostream_迭代器(ofs,“\n”);
考虑到复制函数模板是如何编写的,可能会很清楚在何处需要增量和取消引用:

 std::copy(str_vec.begin(), str_vec.end(), std::ostream_iterator<std::string>(ofs, "\n"));
模板
无效副本(初始开始、初始结束、输出结果)
{
for(InIter it=begin;it!=end;++it)

*result++=*it;//@Martin:请看@Martin:但问题是关于一个
ostream_迭代器
,它是一个输出迭代器。因此,您的
ost++;ost++;ost++;ost++;ost++
示例也是未定义的行为。@Fred Larson:是的,它完全错了。与问题中首先声明的输入迭代器混淆了,而不是s查看输出迭代器。@Martin:我知道这种感觉。不管怎样,你能说抽象地(比如,在一个你不知道具体类型的模板中)使用输出迭代器做这种事情是未定义的行为,但对于给定的迭代器类型来说,这是定义良好的行为(比如向
ostream\u迭代器
)不增加它?@Fred:我甚至还不相信(正如我能理解的那样)使用运算符*而不使用中间运算符++(尽管我也不认为这是不好的)是一种行为。对不起,我不能置身事外。我更清楚为什么现在应该使用ostream_迭代器。感谢您提供的std::copy示例。
ost = str_vec[index];
 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
}