我想添加两个地图以及以下行为。
如果键存在-> 将两个键值相加。
如果键不存在 -> 插入对映射。
我看过一些标准库算法。即转换,但似乎没有做我想要的。
取自此链接
template < class InputIterator, class OutputIterator, class UnaryOperator >
OutputIterator transform ( InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op )
{
while (first1 != last1)
*result++ = op(*first1++); // or: *result++=binary_op(*first1++,*first2++);
return result;
}
我的想法是,在使用时我的第二张地图中只有一个迭代器和适当的仿函数
*result++=binary_op(*first1++,*first2++);
因此,我将无法遍历我的第二张地图以找到关键值。
一个想法是让我自己的算法稍微改变一下。
template < class InputIterator, class ContainerType, class BinaryOperator >
void myTransform ( InputIterator first1, InputIterator last1,
ContainerType cont2,
BinaryOperator binary_op )
{
while (first1 != last1)
binary_op(first1++, cont2); //cont2 passed by reference
}
然后我就可以使用:
cont2.find()
在我的函子中搜索整个地图。
这将是我在想什么的更完整的例子,但我似乎得到了一个我无法解决的编译错误(我有点猜测 BinaryOperator 类型......见下文)?
#include <map>
#include <string>
#include <iostream>
template < class InputIterator, class ContainerType, class BinaryOperator >
void myTransform ( InputIterator first1, InputIterator last1,
ContainerType &cont2,
BinaryOperator binary_op )
{
while (first1 != last1)
binary_op(first1++, cont2); //cont2 passed by reference
}
template<class IteratorType, class ContainerType>
struct AddMapValues:
std::binary_function<IteratorType, ContainerType, void>
{
void operator()(IteratorType itr, ContainerType& cont)
{
if( cont.find(itr->first) != cont.end() ) cont[itr->first] = cont.find(itr->first).second + itr->second;
else cont.insert( (*itr) );
}
};
int main()
{
typedef std::map<std::string, double> stringDoubleMap;
typedef std::map<std::string, double>::iterator stringDoubleMapItr;
typedef void (*ptrfnt)(stringDoubleMapItr, stringDoubleMap& );
stringDoubleMap map1;
stringDoubleMap map2;
map1.insert( stringDoubleMap::value_type("Test1",1.0) );
map1.insert( stringDoubleMap::value_type("Test2",2.0) );
map1.insert( stringDoubleMap::value_type("Test3",3.0) );
map2.insert( stringDoubleMap::value_type("Test1",1.0) );
map2.insert( stringDoubleMap::value_type("Test2",2.0) );
map2.insert( stringDoubleMap::value_type("Test3",3.0) );
myTransform( map1.begin(), map1.end(),
map2,
AddMapValues< stringDoubleMapItr, stringDoubleMap >() );
return 0;
}
这是我的编译器错误:
testingMapTransforms.cxx: In function ‘int main()’:
testingMapTransforms.cxx:52:85: error: no matching function for call to ‘myTransform(std::map<std::basic_string<char>, double>::iterator, std::map<std::basic_string<char>, double>::iterator, stringDoubleMap&, std::map<std::basic_string<char>, double>::iterator, AddMapValues<std::_Rb_tree_iterator<std::pair<const std::basic_string<char>, double> >, std::map<std::basic_string<char>, double> >)’
testingMapTransforms.cxx:52:85: note: candidate is:
testingMapTransforms.cxx:12:20: note: template<class InputIterator, class ContainerType, class OutputIterator, class BinaryOperator> OutputIterator myTransform(InputIterator, InputIterator, ContainerType, OutputIterator, BinaryOperator)
似乎有另一个迭代器来自某个地方并且容器类型没有正确读取?
有任何想法吗?
我在用
gcc - GNU 项目 C 和 C++ 编译器
和
Ubuntu/Linaro 4.6.3-1ubuntu5
谢谢
笔记:
我在答案中更新了上面代码的工作版本。如果您认为我应该更改问题代码,请告诉我。不确定最佳实践