如何解决如何实现两个 std::map<unsigned, unsigned> 的乘法合并?
想象两张这样的地图:
const std::map<unsigned,unsigned> s0{{0,1},{2,2}};
const std::map<unsigned,unsigned> s1{{0,2},{1,3}};
我想得到的是
{{0,3/*1+2*/},3/*0+3*/},2/*2+0*/}};
表示目标中的映射值应该是源中映射值的总和。 关键值是索引。
顺便说一句——这适用于多项式的两个系数相乘——功率会累积。例如。想象两个具有多个自变量 x0..x2 的多项式。一个人可能有 x0 * x1^2 * x2^3 的系数。该系数的映射为 {{0,3}}。将其与 x0^3 相乘,得到 x0^4 * x1^2 * x2^3。
for (auto p0 = s0.begin(),p1 = s1.begin();
p0 != s0.end() || p1 != s1.end();)
if (p0 != s0.end())
if (p1 != s1.end())
if (p0->first < p1->first)
s.insert(*p0++);
else
if (p0->first > p1->first)
s.insert(*p1++);
else
{ s.insert(std::make_pair(p0->first,p0->second + p1->second));
++p0;
++p1;
}
else
{ s.insert(p0,s0.end());
p0 = s0.end();
}
else
{ s.insert(p1,s1.end());
p1 = s1.end();
}
我知道如何使用 for 循环来实现这一点(见上文)。但我想知道是否可以使用 std::merge() 之类的东西来完成。我认为一个人需要一个重载的 std::inserter() 来累积映射的值。有没有更优雅的方式?
解决方法
循环遍历第二个映射并将其键的值与第一映射中相同键的值相加。
for (const auto& p: s1)
s0[p.first] += p.second;
如果无法修改第一张地图,请在第三张地图中复制并添加到其中。
,我不知道有什么标准算法可以开箱即用。 std::merge
是对两个已排序的范围进行排序,所以这里没有帮助。不过,循环可以更简单:
#include <map>
#include <iostream>
int main(){
const std::map<unsigned,unsigned> s0{{0,1},{2,2}};
const std::map<unsigned,unsigned> s1{{0,2},{1,3}};
std::map<unsigned,unsigned> result = s0;
for (const auto& e : s1) result[e.first] += e.second;
for (const auto& e : result){
std::cout << e.first << " " << e.second << "\n";
}
}
0 3
1 3
2 2
PS:也许我误解了,但我不明白这是如何乘以多项式的。如果一个多项式是 2x^2 + 1
而另一个是 3x + 2
,那么它们的乘积是 6x^3 + 4x^2 + 3x + 2
,您可以通过以下方式获得:
std::map<unsigned,unsigned> result;
for (const auto& e0 : s0) {
for (const auto& e1 : s1){
result[e0.first + e1.first] += e0.second * e1.second;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。