2012-01-11 13 views
3

我有一個request結構與std::vector<std::string> arguments在它。我有一個std::map<std::string, std::vector<std::string> > services其中鍵是服務名稱,值是服務響應的參數向量。不同服務的參數可能會重疊(N服務可能有相同或部分相同的參數)。我需要找到與給定請求相對應的所有服務。我不知道是否會更好(從代碼易用性或讀取和請求選擇速度最重要的)我使用Boost ICL而不是當前for_each我用於服務選擇(我只是遍歷每個服務,看看它的任何參數在請求中呈現)?在爲請求選擇服務的情況下,是否可以使用Boost ICL而不是for_each?

回答

3

我會去與最可讀的變種。如果性能受到關注,只需將參數(set)的適用服務緩存到多映射中即可。

如果我有這個想法的權利,下面顯示了一些C++ 11 /升壓這證明了我的意思與可讀性的語法糖:

#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 
+1

能否請你解釋一下'爲(自動與SVC:服務|過濾(適用(REQ)))'線可以重現聖維特boost for_each? – myWallJSON 2012-01-24 17:39:18

+0

@myWallJSON這很棘手! 'BOOST_AUTO(svcs,services | filtered(applicable(req))); BOOST_AUTO(svc,boost :: begin(svcs)); BOOST_FOREACH(svc,svcs){/*...*/}「出現在腦海中 – sehe 2012-01-24 18:22:39

相關問題