用于推进迭代器的标准/升级工具,直到结束或定界符被击中?

时间:2011-11-25 02:51:03

标签: c++ iterator

标准库提供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中已有类似的内容,所以我想我会问。

1 个答案:

答案 0 :(得分:6)

这通常称为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');
}