2011-05-02 70 views
3

在原始字符串的位置如果字符串已被处理是有可能得到一个给定的记号迭代器正指向原始字符串位置:使用升压标记生成器识别从给定的升压token_iterator

boost:tokenizer<> tok("this is the original string"); 
for(tokenizer<>::iterator it=tok.begin(); it!=tok.end();++it) 
{ 
    std::string strToken = *it; 
    int charPos = it.?    /* IS THERE A METHOD? */ 
} 

我意识到我可以创建一个特定的char_separator,其中包含已定义的“保留分隔符”列表,并指定keep_empty_tokens自己尝试跟踪迭代器的进度,但我希望只使用迭代器本身有一个更简单的方法。

回答

5

这似乎是你在找什么:

#include <string> 
#include <iostream> 
#include <boost/tokenizer.hpp> 

int main() 
{ 
    typedef boost::tokenizer<> tok_t; 

    std::string const s = "this is the original string"; 
    tok_t const tok(s); 
    for (tok_t::const_iterator it = tok.begin(), it_end = tok.end(); it != it_end; ++it) 
    { 
    std::string::difference_type const offset = it.base() - s.begin() - it->size(); 
    std::cout << offset << "\t::\t" << *it << '\n'; 
    } 
} 

Online Demo

+0

太好了。谢谢。 – snowdude 2011-05-03 10:25:34

+0

非常好,谢谢! – nccc 2012-07-02 03:25:53

0

如何:

int charPos = it - tok.begin() ; 
+0

你有没有真正尝试过吗?这是我尝试的第一件事,但它不起作用,编译器失败,distance_to无法访问(错误类型的迭代器)。 – snowdude 2011-05-02 11:32:17

+0

根据http://www.boost.org/doc/libs/1_41_0/libs/tokenizer/tokenizer.htm迭代器的类型为std :: string :: const_iterator,它应该只是一个常量指针,除非你是运行STL的一些奇特的调试实现。 – 2011-05-02 12:07:56

+0

我看到了同样的事情。你可以让你的代码编译? – snowdude 2011-05-02 12:25:38

1

如果您只需要当前令牌结束,base()成员函数 可能达到目的:

std::string s = "this is the original string"; 
boost::tokenizer<> tok(s); 
for(boost::tokenizer<>::iterator it=tok.begin(); it!=tok.end();++it) 
{ 
    int charPos = it.base() - s.begin(); 
} 

遗憾的是,似乎不是一路在boost::tokenizer中检索当前令牌的起始 。

+0

谢谢。我接受了另一个答案,因为它更完整。 – snowdude 2011-05-03 10:24:14