我會去與最可讀的變種。如果性能受到關注,只需將參數(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
能否請你解釋一下'爲(自動與SVC:服務|過濾(適用(REQ)))'線可以重現聖維特boost for_each? – myWallJSON 2012-01-24 17:39:18
@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