- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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/
我正在尝试使用 Boost.Icl 来查找重叠间隔的大小。 例如:给定区间 [0, 20], [10, 30], [35, 40] interval_set iset; iset += interva
我的目标是表示一个 3D 空间,该空间被非均匀地离散化为 bin。 一个 bin 包含任意类型的元素(类型是确定的)。 当添加一个 bin(或 bin 所在的区间)并且它与之前添加的 bin 相交时,
在 Boost ICL 中,当我在区间集上调用 cardinality() 或 size() 函数时,返回类型为 size_t,与区间类型无关。在 32 位机器上,这是一个 32 位无符号整数。但是,
我在 Visual Studio 2008 中遇到此错误:错误 1 error C2664: 'BaseUtil::Type::CDouble::CDouble(const BaseUtil::T
我得到了一个对象列表 L,每个对象都包含一个添加时间、一个删除时间、一个名称和一些其他字段。给定时间 T,我想返回一个列表,该列表仅包含 L 中的对象,其中 T 介于对象的添加时间和删除时间之间(此外
我正在迭代 boost interval_set ,我期望每个迭代器都是一个 boost interval ,其值将通过 upper 访问和 lower方法: boost::icl::interval
Boost.ICL的 interval_map 有两种行为:+= 和 insert。两者在不同的上下文中都有用。第一个将两个现有间隔的公共(public)交叉点的值相加。第二个简单地仅在以前未分配 的
揭秘In-Context Learning(ICL):大型语言模型如何通过上下文学习实现少样本高效推理[示例设计、ICL机制详解] 自GPT-3首次提出了In-Context Learning(IC
我正在尝试使用 Boost 序列化库来存档 Boost ICL 间隔集(因为我找不到任何其他或多或少的标准方法来序列化它们)。我想拆分 serialize函数分为两个函数 save和 load .很抱
是否有一种内置方法来获取 boost::icl::interval_map 中的间隔数?我在文档中找不到它。 size() 方法似乎有不同的用途。 最佳答案 interval_count 不起作用?
boost::icl::interval_set test_set; test_set.insert(boost::icl::discrete_interval::closed(10u, 20u)
是否可以制作interval_map具有以下累积行为: [1..3]->1 + [2..4]->2 + [5..7]->3 + [6..8]->4 = [1..4]->{1,2}, [5..8]->{
我想知道是否有更快的方法来判断 2 个 boost::icl::interval_set 是否相等? 我尝试了以下条件以获得更快的结果,但我猜它们并不完整:1.比较它们的大小()2.比较最低位元素3.
如何使用 Boost 间隔容器库移动 discrete_interval? 即我想从区间的 lower() 和区间的 upper() 中减去整数 c?显然我可以创建一个新的间隔,但我正在寻找执行此操作
MSVC 2019 添加了一个新的 _udiv128() 内在 ( documentation ) 我想在我的 C++ 代码中使用。然而,该内在函数目前在 clang-cl 9.0.0 和 Intel
我正在尝试使用 Boost (1.51) ICL 来简化一些区间搜索。 类型: SequenceI::shp_set 是一个 std::set 共享指针 types::mz_t 是一个 Boost::
我一直能够使用 Python 2.7 在我的 Windows 7(64 位)机器上对代码进行 cythonize。但是最近我收到以下错误 错误:\Intel\iCLS 此时出现异常。 对该主题的搜索表
我有一个 request结构与 std::vector arguments在里面。我有一个 std::map > services其中键是服务名称,值是服务响应的参数 vector 。不同服务的参数可
我开始使用 Boost ICL,并且偶然发现了一些非常基础的东西。例如,函数 contains 应该返回 true 或 false,这取决于给定元素是否在区间内。然而,这适用于 [right,left
在visual studio的CUDA项目的project properties page里,好像有自定义host compiler的选项。但是在我选择了intel C++编译器之后,-ccbin选项
我是一名优秀的程序员,十分优秀!