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