从Boost :: Tokenizer中删除重复项?

时间:2012-11-23 12:06:51

标签: c++ boost boost-tokenizer

我正在尝试拆分逗号分隔的字符串,然后对每个令牌执行一些操作,但忽略重复,所以......沿着以下几行:

int main(int, char**)
{
   string text = "token, test   string";

  char_separator<char> sep(", ");
  tokenizer< char_separator<char> > tokens(text, sep);
  // remove duplicates from tokens?
  BOOST_FOREACH (const string& t, tokens) {
    cout << t << "." << endl;
  }
}

有没有办法在boost :: tokenizer上执行此操作?

我知道我可以使用boost :: split和std :: unique解决这个问题,但是想知道是否有办法用tokenizer实现这一点。

1 个答案:

答案 0 :(得分:0)

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';
}