gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:27:37 27 4
gpt4 key购买 nike

我有一个 request结构与 std::vector<std::string> arguments在里面。我有一个 std::map<std::string, std::vector<std::string> > services其中键是服务名称,值是服务响应的参数 vector 。不同服务的参数可能会重叠(N 服务可能具有相同或部分相同的参数)。我需要找到与给定请求相对应的所有服务。我想知道我使用 Boost ICL 是否会更好(从代码的易用性或阅读以及最重要的是要求选择速度)而不是当前的 for_each 我用于服务选择(我只是遍历每个服务并查看它的任何参数是否在请求中出现)?

最佳答案

我会选择最易读的变体。如果关注性能,只需将参数(集)的适用服务缓存到多映射中即可。

如果我的想法是正确的,下面显示了一些 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

关于c++ - 在为请求选择服务的情况下,使用 Boost ICL 而不是 for_each 是否可能且合理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8824995/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com