我正在使用istream_iterator<char> it
,所以无法在反向的范围内进行迭代(或迭代两次,而不hastle大量)。
我想复制,直到满足条件。 有什么会像这样工作在标准库:
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++;
}
只是为了completness,由于标准没有提供出的现成的解决方案,这就是我的解决方案:
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;
}
没有副本,直到开箱。 既然你分别从istream复制没有别的选择,只能使用循环与它break语句。
http://en.cppreference.com/w/cpp/algorithm提供了非常有益的参考所有使用C ++进行编程的算法(不只是那些在算法库也是数字 , 内存和CSTD库 )与中以下是复制算法,即它们采取输入迭代(S),输出迭代(或多个),和λ(S)作为参数:
-
copy_if
“复制范围的元素,通过[定义first
, last
)......只有副本,其谓语的元素pred
返回true” -
transform
“适用的给定功能的范围,并将结果存储在其它范围内”。 -
remove_copy_if
“从范围[份数元件first
, last
),另一个范围开始于d_first
,省略其满足特定条件的元素” -
replace_copy_if
“复制从范围[所有元素first
, last
)到另一范围开始在d_first
替换满足与特定标准的所有元素new_value
” -
unique_copy
“份数从范围[元件first
, last
),另一个范围在开始d_first
以这样的方式不存在的连续相等元件...的元素是使用给定的二进制谓词相比p
” -
partition_copy
“份数从范围[元件first
, last
),以根据由所述谓词返回的值的两个不同范围p
。元素,满足谓词p
,将被复制到范围在开始d_first_true
。元素的其余部分被复制到的范围内,在开始d_first_false
“ -
merge
需要一个第二输入范围 -
set_difference
需要一个第二输入范围 -
set_intersection
需要一个第二输入范围 -
set_symmetric_difference
需要一个第二输入范围 -
set_union
需要一个第二输入范围 -
adjacent_difference
“计算所述第二和所述第一每对相邻的范围内的元件的之间的差异first
, last
)...的差异所使用的给定的二进制函数计算op
” -
partial_sum
“计算在范围[的子范围的元件的部分和first
, last
),并在它们写入范围开始d_first
...综上所述的元素,所述第二版本使用所述给定的二进制函数op
”。 -
exclusive_scan
“计算使用专用前缀和操作binary_op
为范围[ first
, last
)” -
inclusive_scan
“计算使用一个包容前缀和运算binary_op
为范围[ first
, last
)” -
transform_exclusive_scan
“转换成在范围[各元件first
, last
用) unary_op
,然后使用计算异前缀和操作binary_op
在所得范围” -
transform_inclusive_scan
“转换成在范围[各元件first
, last
用) unary_op
,然后使用计算一个包容前缀和运算binary_op
在所得范围”
因为拉姆达仅用于修改1:在范围[1分配first
, last
),以d_first
; transform
, replace_copy_if
,并且所有的数值库算法是无益( adjacent_difference
, partial_sum
, exclusive_scan
, inclusive_scan
, transform_exclusive_scan
,和transform_inclusive_scan
。)
- 如果拉姆达条件成立的范围内的剩余部分之后[
it
, istream_iterator<char>()
中的溶液直接copped到一个第二输出迭代, partition_copy
会解决问题 - 如果拉姆达条件得到满足的范围内的剩余部分之后[
it
, istream_iterator<char>()
中的溶液,以通过函数遍历,该功能可以在每个值被称为条件被满足之后copy_if
(或remove_copy_if
或unique_copy
) - 但在一般情况下,回答你的问题是标准的算法不提供“copy_until”所以你需要使用你的
while
-loop