您好,找到2个 map 的总和的此解决方案,现在我希望Insteed做一个减法!
帖子是:Merge two maps, summing values for same keys in C++
现在,我当然实现了功能sub_pair而不是sum_pair ..但没有发现一件事:
while( true )
{
if(first1 == last1) return std::copy (first2, last2 , result);
if(first2 == last2) return std::copy (first1, last1 , result);
if(comp(*first1, *first2 ) < 0 )
{
*result = *first1 ;
++first1;
}
else if(comp(*first1, *first2 ) > 0 )
{
*result = *first2 ;
++first2;
}
else
{
*result = func(*first1, *first2);
++first1;
++first2;
}
++result ;
}
这里
*result = *first2
应该是负数...是inputIter1 - inputIter2
...但是如果我尝试放入*first2 * -1
;我有一个转换错误,不允许!我能怎么做 ?提前致谢 最佳答案
我认为您应该将其重写为:
template<class Map, class Function>
Map merge_apply( const Map &m1,
const Map &m2,
typename Map::mapped_type identity,
Function func )
{
auto it1 = m1.begin();
auto it2 = m2.begin();
auto comp = m1.value_comp();
Map res;
while( true ) {
bool end1 = it1 == m1.end();
bool end2 = it2 == m2.end();
if( end1 and end2 )
break;
if( end2 or ( !end1 and comp( *it1, *it2 ) ) ) {
res.emplace( it1->first, func( it1->second, identity ) );
++it1;
continue;
}
if( end1 or comp( *it2, *it1 ) ) {
res.emplace( it2->first, func( identity, it2->second ) );
++it2;
continue;
}
res.emplace( it1->first, func( it1->second, it2->second ) );
++it1;
++it2;
}
return res;
}
用法更简单:
auto m3 = merge_apply( m1, m2, 0, []( int a, int b ) { return a + b; } );
auto m4 = merge_apply( m1, m2, 0, []( int a, int b ) { return a - b; } );
auto m5 = merge_apply( m1, m2, 1, []( int a, int b ) { return a * b; } );
并且您不应该提供比较器作为参数,而应该在映射中使用已经存在的比较器,以使其不易出错。
live example