在为请求选择服务的情况下,使用Boost ICL而不是for_each是否可能也是合理的?

时间:2012-01-11 18:54:12

标签: c++ boost boost-icl

我的request结构中包含std::vector<std::string> arguments。我有一个std::map<std::string, std::vector<std::string> > services,其中key是服务名称,value是服务响应的参数的向量。不同服务的参数可能重叠(N服务可能具有相同或部分相同的参数)。我需要找到与给定请求相对应的所有服务。我想知道是否会更好(从代码简易性或阅读和请求选择速度最重要)让我使用Boost ICL而不是当前for_each我用于服务选择(我只是迭代每个服务,看看它的任何参数是否在请求中显示)?

1 个答案:

答案 0 :(得分:3)

我会选择最易读的变体。如果需要考虑性能,只需将参数(集)的适用服务缓存到多图中。

如果我的想法是正确的,下面显示了一些c ++ 11 / boost语法糖,它们表明了我对可读性的意义:

#include <boost/range/numeric.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>

typedef std::vector<std::string> args_t;
typedef std::map<std::string, args_t> service_map;

struct applicable
{
    template <typename T>
        applicable(const T& args) : _args(args) { }

    bool operator()(const service_map::value_type& svc) const
    {
        for (auto& a:_args)
            if (svc.second.end() == boost::find(svc.second, a))
                return false;
        return true;
    }
  private: args_t _args;
};

int main(int argc, const char *argv[])
{
    using namespace boost::adaptors;
    static const service_map services { 
        { "A", { "1","2","3" } }, 
        { "B", { "2","3","4" } },
        { "C", { "3","4","5" } }, 
        { "D", { "4","5","6" } } 
    };

    const std::string label = "request: ";

    for (const auto& req : std::list<args_t> { {"5"}, {"4","3"}, {"1","3"} })
    {
        std::cout << boost::accumulate(req, label) << std::endl;

        for (auto& svc : services | filtered(applicable(req)))
            std::cout << "applicable: " << svc.first << std::endl;
    }
}

当然可以应用许多优化。但是你知道他们对过早优化的看法:)

输出:

request: 5
applicable: C
applicable: D
request: 43
applicable: B
applicable: C
request: 13
applicable: A