Удаление дубликатов из Boost :: Tokenizer?

Я пытаюсь разбить строку через запятую и затем выполнить какое-то действие с каждым токеном, но игнорируя дубликаты, поэтому sth. вдоль следующих линий:

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, но мне было интересно, есть ли способ добиться этого и с помощью токенизатора.

4

Решение

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

Другие решения

Других решений пока нет …