0

map<boost::shared_ptr<service>, rules> service_mapルールがあるところがあります

struct rules
{
boost::unordered_multimap<string, string> set_of_rules_1;
boost::unordered_multimap<string, string> set_of_rules_2;
}

私のルールの場合、httpリクエストheadersとのペアargumentsです。たとえば、そのようなunordered_multimapの1つで、Accept-Language : FRとを見つけることができますAccept-Language : US

それぞれboost::shared_ptr<service>は、から継承するクラスのインスタンスですservice class

このサービス<->ルールのマップにサービスとルールをオンザフライで入力します(一部の共有ライブラリと一部のテキストファイルからルールを使用)。

今、私はのインスタンスを与えられていますdata

struct data
{
map<string, string> headers;
map<string, string> arguments;
}

与えられたオブジェクトごとに、最も関連性の高いものdataを見つけて、serviceservice_mapservice->inherited_method();

ここで関連するということは、ルールが与えられたデータにほとんど適合するものを意味します。たとえば、ルールが Accept-Language : FRありAccept-Language : US、データにペアが含まれている場合よりも、Accept-Language : fr-FR,ru;q=0.8,en-US;q=0.6,en;q=0.4関連性があると考えます。

より高速なソフト検索のためにservice_mapを前処理するための最良の方法と、そのような検索を実装する方法は何ですか?

4

1 に答える 1

2

これは難しい注文であり、ロジックの一部を自分で開発する必要があります。ただし、スケルトンソリューションは次のとおりです。

1)特定のデータセットとの関連性に従ってルールをランク付けする関数を記述します。

int relevance(const rules & r, const data & d); // write this

2)データごとに、ルールのソートされたランキングを作成します。たとえば、多数のイテレータを保持することができます。次に、最も関連性の高いルールセットに一致するサービスを見つけます。

typedef RuleCollection::const_iterator rit;

boost::shared_ptr<service> find_service(cosnt data & d, ...)
{
  std::multimap<int, rit> relevant_rules;

  for (rit it = rc.begin(), end = rc.end(); it != end; ++it)
  {
    // relevant_rules[relevance(*it, d)] = it; // sorry, that was nonsense
    relevant_rules.insert(std::make_pair(relevance(*it, d), it));
  }

  for (auto it = relevant_rules.rbegin(), rend = relevant_rules.rend(); it != rend; ++it)
  {
    for (auto st = service_map.begin(), end = service_map.end(); st != end; ++st)
    {
      if (*st->second == *it->second) return st->first;
    }
  }
  throw std::exception("Could not find suitable service.");
}

私はあなたのすべてのルールがRuleCollection rc;値型のいくつかのコンテナに保持されていると思いますrules

編集:[]マルチマップ要素の挿入を修正しました-明らかな理由により、マルチマップにはアクセス演算子がありません。

于 2011-07-09T23:57:45.420 に答える