Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::copy如何使用流迭代器_C++_Stl_Stream_Iterator - Fatal编程技术网

C++ std::copy如何使用流迭代器

C++ std::copy如何使用流迭代器,c++,stl,stream,iterator,C++,Stl,Stream,Iterator,通常的STL结构是: vector<string> col; copy(istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(col)); 部分答案来自C++标准库:Nicolai M. Josuttis的教程和参考,稍加改动。 表情 istream_iterator<string>(cin) istream_iterator<st

通常的STL结构是:

vector<string> col;
copy(istream_iterator<string>(cin), istream_iterator<string>(),
    back_inserter(col));

部分答案来自C++标准库:Nicolai M. Josuttis的教程和参考,稍加改动。 表情

  istream_iterator<string>(cin)  
istream_iterator<string>()  
字符串的输入运算符通常读取一个由空格分隔的单词

表情

  istream_iterator<string>(cin)  
istream_iterator<string>()  
根据back_inserter文档:

一个std::back\u insert\u迭代器,可用于将元素添加到容器c的末尾

它将所有读入字符串添加到
col


您可以找到有关和的详细信息。

首先,请注意,在这种情况下,根本不需要使用
std::copy
。您可以直接从迭代器初始化向量:

vector<string> col((istream_iterator<string>(cin)),
                    istream_iterator<string>());
因此,它从输入迭代器中读取和项,将该项写入输出迭代器,并重复执行,直到当前位置的迭代器与输入末尾的迭代器相比较(这将在到达文件末尾时发生)。请注意,与其他迭代器不同,istream迭代器允许使用的唯一“结束”位置是文件的结尾


  • 请注意,从技术上讲,这不是一致性行为。我简化了比较,使事情变得简单。两个默认构造的迭代器应该比较相等,如果您从同一个流构造两个迭代器,那么至少在您从流中读取任何内容之前,它们应该比较相等。但这并没有什么实际的区别——您在实际使用中看到的唯一比较是确定您是否已经到达文件的末尾

  • 流操作符可以复制吗?@quant\u dev:你是说流迭代器吗?如果是的话,是的,但效果不大。具体来说,可以复制迭代器并取消引用副本——但是一旦增加了任何迭代器,除你刚才递增的副本以外,任何一个副本都会给UB你最好阅读“C++ STL”这本书。
    vector<string> col((istream_iterator<string>(cin)),
                        istream_iterator<string>());
    
    template <class T>
    class istream_iterator { 
        std::istream *is;
        T data;
    public:
        istream_iterator(std::istream &is) : is(&is) { ++(*this); }
        istream_iterator() : is(nullptr) {}
    
        T operator++() { (*is) >> data; return *this; }
        T operator++(int) { (*is) >> data; return *this; }
    
        T const &operator*() { return data; }   
    
        bool operator !=(istream_iterator &end) { return (*is).good(); }
        bool operator ==(istream_iterator &end) { return !(*is).good(); }
    };
    
    template <class InIt, class OutIt>
    void std::copy(InIt b, InIt e, OutIt d) { 
        while (b != e) {
            *d = *b;
            ++b;
            ++d;
        }
    }