0

我们有一个map<boost::shared_ptr<service>, rules> service_mapwhere 规则

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

在我的情况下,规则是来自 http 请求headersarguments的对,例如在一个这样的 unordered_multimap 中,我们可以找到Accept-Language : FRAccept-Language : US

每个boost::shared_ptr<service>都是继承自 的类的一些实例service class

我用服务和规则(来自一些共享库和一些带有规则的文本文件)动态地填充了这张服务 <-> 规则的地图。

现在我得到了实例data

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

对于每个给定的data对象,我需要从中找到最相关serviceservice_map并调用它service->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 回答