3

私はその中にrequest構造を持っstd::vector<std::string> argumentsています。ここstd::map<std::string, std::vector<std::string> > servicesで、キーはサービス名であり、値はサービスが応答する引数のベクトルです。異なるサービスの引数が重複する場合があります(Nサービスの引数が同じまたは部分的に同じ場合があります)。与えられたリクエストに対応するすべてのサービスを見つける必要があります。サービスの選択に使用する現在のfor_eachの代わりにBoostICLを使用する方が(コードの使いやすさや読み取りと要求の選択速度から)良いのではないかと思います(各サービスを繰り返し処理して、その引数のいずれかがリクエストで提示)?

4

1 に答える 1

3

私は最も読みやすいバリアントを使用します。パフォーマンスが懸念される場合は、引数 (セット) に適用可能なサービスを multimap にキャッシュするだけです。

アイデアが正しければ、以下にいくつかの 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
于 2012-01-11T22:57:04.793 に答える