C++ 使用相同和/或不同的键将映射复制到另一个中
Posted
技术标签:
【中文标题】C++ 使用相同和/或不同的键将映射复制到另一个中【英文标题】:C++ Copy map into another with same and/or different keys 【发布时间】:2017-12-13 15:25:15 【问题描述】:我正在尝试对具有多种基因型的不同人群进行模拟。每个种群都有一个映射(mOccurrences),其中键 = 基因型,值 = 具有该基因型的个体数量。 这些种群应该迁移,当个体进入另一个生态位时,应该更新生态位的地图以反映新种群的基因组分布。 因此,一旦我让我的个人迁移,我会尝试更新 mOccurences;现在一些传入的基因可以与种群中的当前基因相同,因此只应添加它们,而其他可能是新的,因此应在图谱中创建它们。 我试图遍历收入者的地图,然后使用:
mOccurrences.[New->first] += New->second;
但由于某种原因,它只添加了不存在的基因型,而对于两个种群共有的基因型,个体数量不会改变。
我也尝试过find方法和insert,但都无济于事……
void Population::addOccurrences( std::map<Allele, size_t> immigrants )
std::cout<< "Size NICHE Initiale " << mSize << std::endl; //shows size before 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;
std::cout << "Occurrences initial" << std::endl; //PRINTINT current distribution to check
for(it = mOccurrences.begin(); it!= mOccurrences.end(); ++it)
std::cout << it->first << '\t' << it->second << std::endl;
std::cout << "IMMIGRANT" << std::endl;
for(New = immigrants.begin(), it = mOccurrences.begin(); New != immigrants.end(); ++New, ++it)
std::cout << New->first << '\t' << New->second << std::endl; //PRINTING Immigrants genotype distribution
it = mOccurrences.find(New->first);
if(it != mOccurrences.end())
it->second += New->second; //if the allele is already present in population, only add individuals
else
mOccurences.insert(New); //else, insert the pair
std::cout << "Occurrences final" << std::endl; //PRINTING distribution after migration
for(it = mOccurrences.begin(); it!= mOccurrences.end(); ++it)
mSize+= it->second;
std::cout << it->first << '\t' << it->second << std::endl;
【问题讨论】:
你们能提供等位基因的实现吗? 你的代码很乱,你能描述一下你在做什么吗? 【参考方案1】:您的代码一团糟,甚至无法编译。 (例如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;
【讨论】:
对不起,我后来意识到,我尝试了很多东西,结果都搞砸了。我已经尝试过您提出的 C++11 解决方案,但它也不起作用。我已经打印了所有匹配项,但不是所有键都没有添加,值也没有改变。【参考方案2】:我找到了解决办法!
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;
【讨论】:
以上是关于C++ 使用相同和/或不同的键将映射复制到另一个中的主要内容,如果未能解决你的问题,请参考以下文章
使用相同的主键将值从一行添加到另一行 - Oracle SQL