以下的代码,我主要有几个问题,

一,应该如何理解

istream_iterator<string> eos{};   // input sentinel

我认为,这应该就是一个结束的标志,其内部肯定是有一个类似于约定俗成的一个流迭代器结束的标志。

二,如何理解

ostream_iterator<string> oo{os, "\\n"};  // output iterator for stream

书上面是这样说的,

The ostream_iterator’s second argument is used to delimit output values.

经过实际的实验,发现其实是把输入流中的那些一个个单独的元素在输出到 to 这个文件中时,用第二个参数分隔开,这里用的是换行符,也可以换成 \\t 这样的制表符或者其他的符号。

三,如何理解

sort(b.begin(), b.end());   // sort the buffer

这里的 buffer 其实就是 vector。

最后,那个 unique_copy() 其实就是会把 vector 中重复的元素给去掉嘛。后面把 vector 换成了 set,这样就不需要在复制的时候去除了,因为在把元素加入 set 中时,这个数据结构自己就会作一层判断。

#include "../../headers/bookheaders.h"

using namespace std;

int main(int argc, char const *argv[]) {
    string from, to;
    cin >> from >> to;  // get source and target file names

    ifstream is{from};                // input stream for file "from"
    istream_iterator<string> ii{is};  // input iterator for stream
    istream_iterator<string> eos{};   // input sentinel

    ofstream os{to};                        // output stream for file "to"
    ostream_iterator<string> oo{os, "\\n"};  // output iterator for stream

    vector<string> b{ii, eos};  // b is a vector initiallized from input [ii:eos)
    sort(b.begin(), b.end());   // sort the buffer

    unique_copy(b.begin(), b.end(), oo);  // copy buffer to output, discard replicated values

    return !is.eof() || !os;  // return error state
}

Untitled

Untitled