标准/ Boost工具,用于推进迭代器,直到命中结束符或分隔符

Standard / Boost facility for advancing an iterator until either the end or a delimiter is hit?

本文关键字:结束 分隔符 迭代器 Boost 工具 用于 标准      更新时间:2023-10-16

标准库提供了std::advance,但它只将迭代器推进到给定的偏移量。

自己写这个算法很简单:

template<class Iter, class T>
void advance_until(Iter& it, Iter end, T const& delim){
  while(it != end && *it != delim)
    ++it;
}

甚至:

template<class Iter, class T>
void unsafe_advance_until(Iter& it, T const& delim){
  while(*it != delim)
    ++it;
}

这将更接近std::advance的行为方式。

使用例子:

std::string s("hello world!");
std::string::iterator it(s.begin());
advance_until(it, s.end(), 'w');
//unsafe_advance_until(it, 'w');
if(it != s.end())
  std::cout << *it << 'n'; // prints 'w'

但是可能在标准库或Boost中已经有类似的东西了,所以我想我应该问一下

这通常被称为std::find():

std::string::iterator it = std::find(s.begin(), s.end(), 'w');
if (it == s.end()) { /* not found */ }
else               { /* found *it */ }

连续的项可以通过循环找到:

while (it != s.end())
{
  // ...
  ++it; // always valid
  it = std::find(it, s.end(), 'w');
}