C ++使用std :: accumulate生成map <int,int> </int,int>

时间:2012-03-24 11:55:50

标签: c++ dictionary vector lambda accumulate

我在从指针向量创建std::map<int, int>时遇到问题,称为files。每个指针指向一个具有三个成员变量的对象,其中一个变量是size类型int。地图的关键是size,值将是具有相同size的对象数。

不要在第二个上浪费你的时间!这是我计划的下一步,我想已经弄明白了。对于地图的初始化,我使用std::accumulate,因为它返回一个值。我使用std::tr1::shared_ptr作为指针,使用lambda表达式作为谓词函数。我在编译方面遇到了问题。

以下是代码段:

map<int,int>* sizes = new map<int,int>();
sizes = accumulate(files.begin(), files.end(),sizes,
[&sizes](map<int,int> acc, shared_ptr<CFileType>& obj)
{
    return sizes->insert(pair<int,int>(obj->getSize(),0));
});

这是错误:

  

错误C2664:'std :: pair&lt; _Ty1,_Ty2&gt; `anonymous-namespace':::: operator()(std :: map&lt; _Kty,_Ty&gt;,std :: tr1 :: shared_ptr&amp;)const':无法从'std :: map&lt; _Kty,_Ty&gt转换参数1 ; 'to'std :: map&lt; _Kty,_Ty&gt;'

我不太确定要传递给lambda函数的内容。我尝试了pair<int, int>,但它没有用。另外,我必须提到这个映射返回到另一个函数,所以它必须是一个指针。

您的任何帮助将不胜感激。谢谢!


更新

问题解决了,这是解决方案:

map<int,int>* sizes = accumulate(files.begin(), files.end(), new map<int,int>(),
    [](map<int,int>* acc, shared_ptr<CFileType>& obj)->map<int,int>*
    {
        acc->insert(pair<int,int>(obj->getSize(),0));
        return acc;
    });

1 个答案:

答案 0 :(得分:2)

错误消息是您在两种std::map之间存在类型不匹配。看起来错误在代码中调用 lambda,这显然传递了acc参数的错误内容。好消息是发布的lambda实际上从未使用acc参数。