减去2张地图

时间:2017-11-03 15:57:39

标签: c++ dictionary

嗨发现这个解决方案为2地图的总和,现在我想要进行减法!

帖子是: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;我得到了转换错误,不允许!我能怎么做 ?提前谢谢

2 个答案:

答案 0 :(得分:2)

我认为你应该把它重写为:

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

答案 1 :(得分:1)

当您通过\documentclass{article} \begin{document} <<setup, echo=FALSE>>= library("knitr") knit_hooks$set(inline = function(x) { if (is.numeric(x)) return(knitr:::format_sci(x, 'latex')) highr:::hi_latex(x) }) @ \Sexpr{'plot(x, y)'} works. \Sexpr{'lm(response ~ treatment, data)'} does not show the tilde. \end{document} 的迭代器进行间接时,会得到一个std::map<T1, T2>,其中包含该地图元素的键和值。因此,当您尝试编写std::pair<T1, T2>时,您尝试将一对编号相乘,但您只想将该值相乘。所以它应该是:

*first2 * -1