C++ std::copy如何使用流迭代器
通常的STL结构是: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
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;
}
}