在地图中对匹配对执行功能

Execute a function on matching pairs in a map

本文关键字:执行 功能 地图      更新时间:2023-10-16

我有一些看起来像这样的代码;给定两个地图,如果first密钥在两个地图中都存在,则将两个second值乘以将所有产品总结。例如:

s1 = {{1, 2.5}, {2, 10.0}, {3, 0.5}};
s2 = {{1, 10.0},           {3, 20.0}, {4, 3.33}};

答案应为 2.5*10.0 + 0.5*20.0,是匹配键的产品的总和

double calcProduct(std::map<int, double> const &s1, std::map<int, double> const &s2)
{
    auto s1_it = s1.begin();
    auto s2_it = s2.begin();
    double result = 0;
    while (s1_it != s1.end() && s2_it != s2.end())
    {
        if (s1_it->first == s2_it->first)
        {
            result += s1_it->second * s2_it->second;
            s1_it++:
            s2_it++;
        }
        else if (s1_it->first < s2_it->first)
        {
            s1_it = s1.lower_bound(s2_it->first);
        }
        else
        {
            s2_it = s2.lower_bound(s1_it->first);
        }
    }
    return result;
}

我想重构,std::set_intersection似乎与我想要的东西很近,因为该文档具有使用std::back_inserter的示例,但是有没有办法让它在地图上工作并避免中间数组?

所使用的代码已经非常接近实现set_intersect的方式。我看不到创建新地图并迭代它的任何优势。

但是,我想提到的代码有几件事。

如果您要增加迭代器,则不应该使它们稳定。

我希望在寻找同等元素时会有更多的错过。我建议先进行比比较少的:

double calcProduct( std::map<int , double> const &s1 , std::map<int , double> const &s2 )
{
    auto  s1_it = s1.begin();
    auto  s2_it = s2.begin();
    double result = 0;
    while ( s1_it != s1.end() && s2_it != s2.end() )
    {
        if ( s1_it->first < s2_it->first )
        {
            s1_it = s1.lower_bound( s2_it->first );
        }
        else if(s2_it->first < s1_it->first )
        {
            s2_it = s2.lower_bound( s1_it->first );
        }
        else
        {
            result += s1_it->second * s2_it->second;
            s1_it++;
            s2_it++;
        }
    }
    return result;
}