嗨发现这个解决方案为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
;我得到了转换错误,不允许!我能怎么做 ?提前谢谢
答案 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; } );
并且您不应该将比较器作为参数提供,而是使用映射中已有的比较器来减少错误。
答案 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