2011-07-09 9 views
0

私たちは、ルールはルールの私の場合はunordered_multimap <string、string>をマップする<string、string>ソフト検索、早い検索のためにプリプロセスされたマップをどのようにするか?

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

あるmap<boost::shared_ptr<service>, rules> service_mapは、私たちがAccept-Language : FRAccept-Language : USを見つけることができるそのようなunordered_multimapで例えばHTTPリクエストheadersargumentsのからペア、ですしています。

boost::shared_ptr<service>は、service classを継承するクラスのインスタンスです。

私はサービスとルール(いくつかの共有ライブラリといくつかのルール付きテキストファイルから)でフライでルールを< - >このサービスマップに記入します。

今、私は私がservice_mapから最も関連性の高いserviceを見つけて、ここでは、そのルールに合うものを意味し、関連することでそのservice->inherited_method();

を呼び出す必要が与えられたそれぞれのdataオブジェクトについてdata

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

のインスタンスを与えられています与えられたデータがほとんどです。たとえば、Accept-Language : FRとのルールにデータが含まれている場合よりも、Accept-Language : fr-FR,ru;q=0.8,en-US;q=0.6,en;q=0.4が適切と考えられます。

私のservice_mapを高速処理し、そのような検索を実装する方法を前処理するにはどうすればよいでしょうか?

+0

これはAccept-Languageについてのみですか、それとも一致させるための他のディメンションがありますか?実際のコンセプトや予想されるデータのバリエーションについては、C++の詳細や詳細についてはあまり話題にはなりません。 –

答えて

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."); 
} 

私はすべてのあなたのルールが値型rulesのいくつかの容器、RuleCollection rc;に保管されていることを想定しています。

編集:固定マルチマップ要素の挿入 - マルチマップには明白な理由から[]アクセス演算子がありません。

関連する問題