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

ActionScript 3.0 通过按键切换视频

将数组项映射/链接到另一个对象的键

如何使用键将对象添加到 NSMutableDictionary?

Python字典创建、基本操作以及常用方法

Visual C++ 2010 中的 STL 映射实现和线程安全