- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 boost::shared_ptrs
的 MultiIndex 容器到类 Host
的成员。这些成员包含私有(private)数组 bool infections[NUM_SEROTYPES]
揭示宿主关于 1,...,NUM_SEROTYPES 血清型中每一个的感染状态。我希望能够在模拟中随时确定感染给定血清型的人数,但我不确定如何:
Host::isInfected( int s )
,其中 s
是感兴趣的血清型.据我了解,MultiIndex key 提取器不允许采用参数。typedef ...
。我将改变模拟之间的血清型数量。 (有经验的程序员认为这应该是可能的吗?如果是的话,我会尝试的。)提前致谢。
更新
我要出差了,直到 5 月 5 日星期三才能检查任何答案。这意味着根据其他人的投票,谁的答案最受欢迎,谁就会赢得赏金(假设达到了某个最低阈值) )--我不会及时回来选择我认为最好的答案。出于此赏金的目的,请假设 NUM_SEROTYPES ~8-10,因此我不想使用第三个选项或任何需要一些糟糕的组合枚举的选项。我真的希望找到一种方法来根据给定血清型的宿主感染状态对 MultiIndex 进行排序。
此外,如果这是一个愚蠢的问题,我很想知道为什么。谢谢。
更新 2,5 月 6 日
这些回复很有帮助,帮助我在继续优化和自定义程序时了解我的选择。我目前无法授予赏金或解决方案,但如果可以的话,我会向 outis 提供最彻底和信息最丰富的解决方案。
我目前的策略是保持 int allInfecteds[ ALL_AGES ][ NUM_SEROTYPES ]
。阵列的维护将内置到事件定义中(例如,死亡、恢复、衰老和被感染)。在按感兴趣的家庭对 MultiIndex 进行排序后,通过单独查询主机来获取特定年龄段受感染的家庭成员总数。 (相对于主机总数而言,家庭数量极少。)随着我的查询变得越来越复杂,我可能会用 multimap 替换二维数组并使用 count_if
。如果我们最终用相对较少的血清型进行模拟,我可能会尝试使用下面的元编程示例或使用显式索引。
再次衷心感谢所有评论者帮助我了解各种选择及其成本。如果我尝试重建索引或下面提出的元编程解决方案,我将在此处发布结果。
最佳答案
解决方案 2(为每个血清型维护一个单独的索引可以通过一些元编程来完成:
#include <boost/mpl/push_back.hpp>
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/shared_ptr.hpp>
using namespace boost::multi_index;
struct host
{
static const int NUM_SEROTYPES=8;
bool infections[NUM_SEROTYPES];
};
typedef boost::shared_ptr<host> host_ptr;
template<typename Num>
struct infection_extractor
{
typedef bool result_type;
result_type& operator()(const host_ptr& p)const
{
return p->infections[Num::value];
}
};
typedef boost::mpl::fold<
boost::mpl::range_c<int,0,host::NUM_SEROTYPES>,
boost::mpl::vector<>,
boost::mpl::push_back<
boost::mpl::_1,
ordered_non_unique<infection_extractor<boost::mpl::_2> >
>
>::type index_list_type;
typedef multi_index_container<
host_ptr,
index_list_type
> multi_t;
template<int Num>
std::size_t infected_with(const multi_t& m)
{
return m.get<Num>().count(true);
};
typedef std::size_t (*infected_with_type)(const multi_t&);
struct infected_with_table_assigner
{
infected_with_table_assigner(infected_with_type* table):table(table)
{
boost::mpl::for_each<
boost::mpl::range_c<int,0,host::NUM_SEROTYPES>
>(*this);
}
template<typename Num>
void operator()(Num)const{table[Num::value]=&infected_with<Num::value>;}
infected_with_type* table;
};
std::size_t infected_with(const multi_t& m,int n)
{
static infected_with_type table[host::NUM_SEROTYPES];
static infected_with_table_assigner assigner(table);
return table[n](m);
}
#include <iostream>
int main()
{
multi_t m;
host h;
for(int i=0;i<200;++i){
for(int j=0;j<host::NUM_SEROTYPES;++j)h.infections[j]=(i&(1<<j))?true:false;
m.insert(host_ptr(new host(h)));
}
for(int n=0;n<host::NUM_SEROTYPES;++n)
{
std::cout<<"infected with serotype "<<n<<": "
<<infected_with(m,n)<<std::endl;
}
}
但要考虑到维护 8~10 个索引会消耗内存和插入时间。一个更简单的解决方案是只维护一个 random access index并在查询之前对其进行适当排序(使用适合每个时刻感兴趣的特定血清型的自定义比较器)。
关于c++ - (如何)我可以为 Boost MultiIndex 近似 "dynamic"索引( key 提取器)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2694973/
所以我必须用以下方法来近似 Pi:4*(1-1/3+1/5-1/7+1/9-...)。它也应该基于迭代次数。所以函数应该是这样的: >>> piApprox(1) 4.0 >>> piApprox(1
输入:图 G 输出:多个独立集,使得一个节点对所有独立集的成员资格是唯一的。因此,节点与它自己的集合中的任何节点都没有连接。这是一个示例路径。 由于这里需要澄清,因此再次改写: 将给定的图划分为多个集
我已经使用查找表和低阶多项式近似实现了定点 log2 函数,但对整个 32 位定点范围 [-1,+1) 的准确度不太满意。输入格式为 s0.31,输出格式为 s15.16。 我在这里发布这个问题,以便
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
我的目标是近似二项式变量总和的分布。我使用以下纸张The Distribution of a Sum of Binomial Random Variables作者:肯·巴特勒和迈克尔·斯蒂芬斯。 我想
我知道有方法 approximate cubic Bezier curves ( this page 也是一个很好的引用),但是有没有更快的方法来逼近 N 次贝塞尔曲线?还是只能使用下面的概括? 来自
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它有助于我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注意
我是 C++ 和编码本身的初学者,所以请原谅任何词汇错误。我找不到这个具体问题,但在互联网上找到了类似的问题,但我仍然很难获得我需要的结果。 所以我使用莱布尼茨公式来近似 pi,即: pi = 4 ·
有多种方法可以通过显示名称查找联系人。例如这个答案Android - Find a contact by display name 但是我需要找到模糊匹配的联系人。例如如果找不到“Kim”,我需要返回
我一直在尝试使用以下代码使用级数表示来近似 e 以获得尽可能多的精度数字,但无论我计算多少项,精度数字的数量似乎都保持不变。即: 2.718281984329223632812500000000000
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有CS学位的人当然会知道Big O stands for是什么。 它可以帮助我们评估算法的可扩展性。 但是我很好奇,您如何计算或估算算法的复杂性? 最佳答案 我会尽力在这里简单地解释它,但要注
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
大多数拥有计算机科学学位的人肯定知道什么是Big O stands for。 它有助于我们衡量一个算法的实际效率,如果您知道在what category the problem you are try
我做了很多随机的数学程序来帮助我完成作业(合成除法是最有趣的),现在我想反转一个激进的表达式。 例如,在我方便的 TI 计算器中我得到 .2360679775 好吧,我想将该数字转换为等效的无理数表达
我可以通过 CPU 分析器看到,compute_variances() 是我项目的瓶颈。 % cumulative self self total
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的可扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它
这是迄今为止我的代码, from math import * def main(): sides = eval(input("Enter the number of sides:"))
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
大多数拥有 CS 学位的人肯定知道什么 Big O stands for . 它帮助我们衡量算法的扩展性。 但我很好奇,你如何计算或近似算法的复杂性? 最佳答案 我会尽我所能用简单的术语在这里解释它,
我是一名优秀的程序员,十分优秀!