我正在尝试使用每种多种基因型模拟不同的群体。每个群体都有一个地图(mOccurrences),其中key =基因型,value =具有该基因型的个体数量。 这些种群应该迁移,当个体进入另一个生态位时,应更新生态位图以反映新种群的基因组分布。 因此,一旦我让我的个人迁移,我会尝试更新mOccurences;现在一些传入的基因可以与群体中的当前基因相同,因此它们只应该被添加,而其他基因可以是新的,因此它们应该在地图内创建。 我试图迭代收入者的地图,然后使用:
mOccurrences。[New-> first] + = New-> second;
但由于某种原因,它只添加了不存在的基因型,对于两个群体共有的基因型,个体数量不会改变。
我也试过了find方法和插入但是无济于事......
{{1}}
答案 0 :(得分:0)
你的代码很乱,甚至都不会编译。 (例如mOccurences.insert(New);
无效)。看起来你只需要这个:
void Population::addOccurrences( std::map<Allele, size_t> immigrants )
{
for( std::map<Allele, size_t>::const_iterator it = immigrants.begin(); it!= immigrants.end(); ++it)
mOccurrences[ it->first ] += it->second;
}
注意:您应该将参数类型更改为const引用,没有理由按值复制它,这可能很昂贵。如果你可以使用C ++ 11:
void Population::addOccurrences( const std::map<Allele, size_t> &immigrants )
{
for( const auto &im : immigrants )
mOccurrences[ im.first ] += im.second;
}
答案 1 :(得分:0)
我找到了解决方案!
void Population::addOccurrences( std::map<Allele, size_t> immigrants ) {
mSize = 0; //number of individuals in the niche in total must be updates
std::map<Allele, size_t>::iterator New;
std::map<Allele, size_t>::iterator it;
for(it = mOccurrences.begin(); it != mOccurrences.end(); ++it) {
Allele temp = it->first;
for(New = immigrants.begin(); New != immigrants.end(); ++New) {
if(temp == New->first) {
it->second += New->second;
immigrants.erase(New);
}
}
}
mOccurrences.insert(immigrants.begin(), immigrants.end());
for(it = mOccurrences.begin(); it!= mOccurrences.end(); ++it) {
mSize+= it->second;
}
}