C++ C++;使用std::accumulate生成映射<;int,int>;

C++ C++;使用std::accumulate生成映射<;int,int>;,c++,dictionary,vector,lambda,accumulate,C++,Dictionary,Vector,Lambda,Accumulate,从名为文件的指针向量创建std::map时遇到问题。每个指针指向一个具有三个成员变量的对象,其中一个是size,类型为int。地图的键是大小,值是具有相同大小的对象数 不要在第二件事上浪费时间!这是我计划的下一步,我想我已经弄明白了。对于映射的初始化,我使用的是std::acculate,因为它返回一个值。我使用std::tr1::shared_ptr作为指针,使用lambda表达式作为谓词函数。我在编译方面有问题 下面是代码片段: map<int,int>* sizes = new

从名为
文件的指针向量创建
std::map
时遇到问题。每个指针指向一个具有三个成员变量的对象,其中一个是
size
,类型为
int
。地图的键是
大小
,值是具有相同
大小
的对象数

不要在第二件事上浪费时间!这是我计划的下一步,我想我已经弄明白了。对于映射的初始化,我使用的是
std::acculate
,因为它返回一个值。我使用
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));
});
map*size=newmap();
大小=累积(files.begin()、files.end()、大小、,
[&sizes](地图附件、共享\u ptr和obj)
{
返回大小->插入(成对(obj->getSize(),0));
});
以下是错误:

错误C2664:'std::pair'anonymousnamespace'::operator()(std::map,std::tr1::shared_ptr&)const':无法将参数1从'std::map'转换为'std::map'

我不太确定传递给lambda函数的是什么。我试过使用
配对
,但不起作用。另外,我必须提到,这个映射被返回到另一个函数,所以它必须是一个指针

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


更新:

问题已解决,以下是解决方案:

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;
    });
map*size=累计(files.begin()、files.end()、new map(),
[](地图*acc,共享\u ptr和obj)->地图*
{
acc->insert(成对(obj->getSize(),0));
返回acc;
});

错误消息是两种
std::map
s之间存在类型不匹配。看起来错误在调用lambda的代码中,调用lambda的代码显然为
acc
参数传递了错误的内容。好消息是lambda,正如发布的那样,从来没有实际使用过
acc
参数。

我有两种类型的“映射”?感谢您找到了一个不需要的算法,我确实想使用“acc”,但在lambda函数中使用了“size”。虽然我知道
map
s的类型,但我看不到另一个的类型。但错误消息“
无法将参数1从“std::map”转换为“std::map”
”的意思正是这样,即使它没有告诉您每个映射中的
\u Kty
\u Ty
的类型。当您实际使用lambda时,您必须查看作为第一个参数传递给lambda的内容,并确定该类型与
std::map
的区别。它现在可以工作了,我没有意识到map.insert()不会返回映射,而是返回它插入的对。代码现在起作用了。你为什么要更新你的地图?这不是Java。。。