我正在使用 istream_iterator<char> it
, 所以我不能反向迭代范围(或者迭代两次,没有太多的麻烦。)
我想复制直到满足条件。在标准库中有没有这样的东西:
copy_until(it, istream_iterator<char>(), ostream_iterator<char>(cout), [](const unsigned char i){ return isalpha(i); })
如果我必须滚动一些东西,我只是希望有一些我无法弄清楚的魔法。
编辑:
我所期望的行为 copy_until
函数是:
while(it != istream_iterator<char>()) {
if(!isalpha(static_cast<unsigned char>(*it))) break;
cout << *it++;
}
最佳答案
只是为了完整性,因为标准没有提供开箱即用的解决方案,这就是我的解决方案:
template<class _InIt, class _OutIt, class _Pr>
inline void copy_until (_InIt _First, _InIt _Last, _OutIt _Dest, _Pr _Pred) {
while ((_First != _Last) && _Pred(*_First)) {
*_Dest++ = *_First++;
}
}
这就是我使用它的方式:
copy_until(std::istreambuf_iterator<char>(is),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(os),
[] (char c) { return <some usefull condition here> });
例如从输入流中读取一个只有 alnum 字符的字符串:
std::istream& operator>> (std::istream& is, std::string& n) {
std::ostringstream str;
copy_until(std::istreambuf_iterator<char>(is),
std::istreambuf_iterator<char>(),
std::ostreambuf_iterator<char>(str),
std::isalnum);
n = str.str();
return is;
}
关于c++ - 有没有标准的算法可以复制到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40869519/