4

カンマ区切りの文字列を分割してから、各トークンに対して何らかのアクションを実行しようとしていますが、重複を無視しているので、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

1 に答える 1

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';
}
于 2012-11-25T20:43:31.630 に答える