有没有一个标准算法副本,直到?(Is There a Standard Algorithm to C

2019-09-30 11:45发布

我正在使用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++;
}

Answer 1:

只是为了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;
}


Answer 2:

没有副本,直到开箱。 既然你分别从istream复制没有别的选择,只能使用循环与它break语句。



Answer 3:

http://en.cppreference.com/w/cpp/algorithm提供了非常有益的参考所有使用C ++进行编程的算法(不只是那些在算法库也是数字内存CSTD库 )与中以下是复制算法,即它们采取输入迭代(S),输出迭代(或多个),和λ(S)作为参数:

  • copy_if “复制范围的元素,通过[定义firstlast )......只有副本,其谓语的元素pred返回true”
  • transform “适用的给定功能的范围,并将结果存储在其它范围内”。
  • remove_copy_if “从范围[份数元件firstlast ),另一个范围开始于d_first ,省略其满足特定条件的元素”
  • replace_copy_if “复制从范围[所有元素firstlast )到另一范围开始在d_first替换满足与特定标准的所有元素new_value
  • unique_copy “份数从范围[元件firstlast ),另一个范围在开始d_first以这样的方式不存在的连续相等元件...的元素是使用给定的二进制谓词相比p
  • partition_copy “份数从范围[元件firstlast ),以根据由所述谓词返回的值的两个不同范围p 。元素,满足谓词p ,将被复制到范围在开始d_first_true 。元素的其余部分被复制到的范围内,在开始d_first_false
  • merge需要一个第二输入范围
  • set_difference需要一个第二输入范围
  • set_intersection需要一个第二输入范围
  • set_symmetric_difference需要一个第二输入范围
  • set_union需要一个第二输入范围
  • adjacent_difference “计算所述第二和所述第一每对相邻的范围内的元件的之间的差异firstlast )...的差异所使用的给定的二进制函数计算op
  • partial_sum “计算在范围[的子范围的元件的部分和firstlast ),并在它们写入范围开始d_first ...综上所述的元素,所述第二版本使用所述给定的二进制函数op ”。
  • exclusive_scan “计算使用专用前缀和操作binary_op为范围[ firstlast )”
  • inclusive_scan “计算使用一个包容前缀和运算binary_op为范围[ firstlast )”
  • transform_exclusive_scan “转换成在范围[各元件firstlast用) unary_op ,然后使用计算异前缀和操作binary_op在所得范围”
  • transform_inclusive_scan “转换成在范围[各元件firstlast用) unary_op ,然后使用计算一个包容前缀和运算binary_op在所得范围”

因为拉姆达仅用于修改1:在范围[1分配firstlast ),以d_first ; transformreplace_copy_if ,并且所有的数值库算法是无益( adjacent_differencepartial_sumexclusive_scaninclusive_scantransform_exclusive_scan ,和transform_inclusive_scan 。)

  • 如果拉姆达条件成立的范围内的剩余部分之后[ itistream_iterator<char>()中的溶液直接copped到一个第二输出迭代, partition_copy会解决问题
  • 如果拉姆达条件得到满足的范围内的剩余部分之后[ itistream_iterator<char>()中的溶液,以通过函数遍历,该功能可以在每个值被称为条件被满足之后copy_if (或remove_copy_ifunique_copy
  • 但在一般情况下,回答你的问题是标准的算法不提供“copy_until”所以你需要使用你的while -loop


文章来源: Is There a Standard Algorithm to Copy Until?