对地图中的匹配对执行函数
Execute a function on matching pairs in a map
我有一些代码大致如下;给定两个映射,如果两个映射中都存在 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
似乎接近我想要的,因为文档有 an example using 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;
}
我有一些代码大致如下;给定两个映射,如果两个映射中都存在 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
似乎接近我想要的,因为文档有 an example using 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;
}