boost.tokenizer 可以做很多很酷的事情,但它不能做到这一点,答案确实是“不”。
如果您只想删除相邻的重复项,boost.range 可以帮助使其看起来更简洁:
#include <iostream>
#include <string>
#include <boost/range/adaptor/uniqued.hpp>
#include <boost/foreach.hpp>
#include <boost/tokenizer.hpp>
using namespace boost;
using namespace boost::adaptors;
int main()
{
std::string text = "token, test string test, test test";
char_separator<char> sep(", ");
tokenizer< char_separator<char> > tokens(text, sep);
BOOST_FOREACH (const std::string& t, tokens | uniqued ) {
std::cout << t << "." << '\n';
}
}
这打印:
token.
test.
string.
test.
为了仅对全局唯一令牌执行某些操作,您需要以一种或另一种方式存储状态。最简单的解决方案可能是中间集:
char_separator<char> sep(", ");
tokenizer< char_separator<char> > tokens(text, sep);
std::set<std::string> unique_tokens(tokens.begin(), tokens.end());
BOOST_FOREACH (const std::string& t, unique_tokens) {
std::cout << t << "." << '\n';
}