【问题标题】:C++ using std::accumulate to generate a map<int,int>C++ 使用 std::accumulate 生成 map<int,int>
【发布时间】:2012-03-24 11:55:50
【问题描述】:

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

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

这里是sn-p的代码:

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<_ty1> `anonymous-namespace'::::operator ()(std::map<_kty>,std::tr1::shared_ptr &) const' : 无法将参数 1 从 'std::map<_kty> ' 转换为 'std::map<_kty>'

我不太确定将什么传递给 lambda 函数。我试过pair&lt;int, int&gt;,但没用。另外,不得不提的是,这个映射是返回给另一个函数的,所以它必须是一个指针。

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


更新:

问题解决了,解决办法如下:

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;
    });

【问题讨论】:

  • 你为什么要更新你的地图?这不是 Java...

标签: c++ dictionary vector lambda accumulate


【解决方案1】:

错误信息是您在两种std::maps 之间存在类型不匹配。看起来错误出现在 调用 lambda 的代码中,这显然为 acc 参数传递了错误的东西。好消息是,正如发布的那样,lambda 从未真正使用过acc 参数。

【讨论】:

  • 我有哪两种“地图”?感谢您找到一个不需要的算法,我确实想使用“acc”,但在 lambda 函数中使用了“sizes”。
  • 虽然我知道maps 之一的类型,但我看不到另一个的类型。但是错误消息“cannot convert parameter 1 from 'std::map&lt;_Kty,_Ty&gt; ' to 'std::map&lt;_Kty,_Ty&gt;'”的含义正是如此,即使它没有告诉您每个映射中_Kty_Ty 的类型。当您实际使用 lambda 时,您必须查看作为第一个参数传递给 lambda 的内容,并确定该类型与 std::map&lt;int, int&gt; 的不同之处。
  • 它现在可以工作了,我没有意识到 map.insert() 不返回地图,而是它插入的对。代码现在可以工作了。
猜你喜欢
  • 1970-01-01
  • 2010-11-18
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
相关资源
最近更新 更多