您好,找到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

09-26 14:41