Lambda和map,param by reference - 编译错误

时间:2017-05-15 19:14:41

标签: c++ c++11 lambda

我试图将我的问题缩小到一个最小的例子:

#include <algorithm>
#include <map>
#include <string>
#include <vector>

int main()
{
    std::vector<int> result;
    std::map<std::string, std::pair<unsigned int, std::vector<int>>> other;

    if (true)
    {
        std::for_each(other.begin(), other.end(),
            [&](std::pair<std::string, std::pair<unsigned int, std::vector<int>>> & data)
            {
                result.insert(result.end(), data.second.second.begin(), data.second.second.end());
            });
    }

    return 0;
}

我收到编译错误:

error C2664: 'void main::<lambda_1b93236899a42921c1aec8d5288e5b90>::operator ()(std::pair<std::string,std::pair<unsigned int,std::vector<int,std::allocator<_Ty>>>> &) const': cannot convert argument 1 from 'std::pair<const _Kty,_Ty>' to 'std::pair<std::string,std::pair<unsigned int,std::vector<int,std::allocator<_Ty>>>> &'

据我所知,lambda参数确实是对我们正在迭代的地图所包含的类型的引用。这是我应该使用的类型,对吗?

如果我在编译data之前删除了安瓿。

为什么?

我不想按值传递每个元素,因为这些集合将在我的真实程序中包含大量数据。

如果我用auto &替换lambda param它会编译,这让我相信lambda param中的类型与map中包含的类型不匹配,但它看起来确实对我有用。另外,为什么原始编译没有&amp;如果类型错了?

我缺少什么/不理解?

2 个答案:

答案 0 :(得分:6)

std::map<Key, T>value_typestd::pair<const Key, T>,而不是std::pair<Key, T>。没有&符号的版本会生成每对的副本。由于您可以将const Key复制到Key,一切都很好。在lambda的参数类型中添加const

#include <algorithm>
#include <map>
#include <string>
#include <vector>

int main()
{
    std::vector<int> result;
    std::map<std::string, std::pair<unsigned int, std::vector<int>>> other;

    if (true)
    {
        std::for_each(other.begin(), other.end(),
            [&](std::pair<const std::string, std::pair<unsigned int, std::vector<int>>> & data)
        // Add this const ^^^^^
        {
            result.insert(result.end(), data.second.second.begin(), data.second.second.end());
        });
    }

    return 0;
}

答案 1 :(得分:3)

我今天一直在努力解决同样的问题。

我解决了在<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <h1 id="top">Hello</h1> <ol class="container"> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> <li><a href="#top">a</a></li> </ol> std::pair

中输入键值类型的问题
const

在考虑了一下之后,这很合乎逻辑:
您无法将[&](std::pair<const std::string, std::pair<unsigned int, std::vector<int>>> & data) // ^^^^^ 条目的key_value更改为其他内容。因此,如果它使用std::map循环和引用,则需要将其指定为auto