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

Posted

技术标签:

【中文标题】从 Boost::Tokenizer 中删除重复项?【英文标题】:Removing duplicates from Boost::Tokenizer? 【发布时间】:2012-11-23 12:06:50 【问题描述】:

我正在尝试拆分一个逗号分隔的字符串,然后对每个令牌执行一些操作,但忽略重复项,等等。大致如下:

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 来解决这个问题,但我想知道是否也有办法使用分词器来解决这个问题。

【问题讨论】:

std::unique 仅适用于排序范围,您的输入是否始终排序? (如果没有,您是否有兴趣过滤所有重复项,或者只过滤彼此相同的相邻元素) 我很确定答案是否定的——tokenizer 不会跟踪以前的 token,所以它无法知道当前的 token 是新的还是重复以前的。跨度> @Mankarse:你说得对,我在 boost::split 案例中对 std::sort 进行了额外调用。 【参考方案1】:

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

【讨论】:

以上是关于从 Boost::Tokenizer 中删除重复项?的主要内容,如果未能解决你的问题,请参考以下文章

Boost.Tokenizer 用于引号和括号

字符串迭代器不兼容 boost::tokenizer

Boost::tokenizer 逗号分隔 (c++)

如何使用 boost::tokenizer 作为 C++ 类成员?

使用具有不同参数的 Boost Tokenizer escaped_list_separator

boost tokenizer 的随机行为