算法错误:参数无法从对中隐蔽1

时间:2019-06-09 02:13:52

标签: c++ std-pair

在此作业中,我正在制作一个应用程序,其中用户输入电话号码(无论它是否是字母)。

我尝试在地图或矢量上使用const来查看它是否可以解决问题,但我认为这只会造成更多错误。

这是我认为会引起一些问题的代码

std::vector<int> mappednums;
    for (char& achar : word) {
        auto itr = std::find_if(lookupmap.begin(), lookupmap.end(), [&](std::pair<int, std::vector<char>>& aPair)->bool
            {

                auto itr = std::find_if(aPair.second.begin(), aPair.second.end(), [&](char& ch) {
                    return ch == achar;
                    });

                if (itr != aPair.second.end()) {
                    return true;
                }
                });
        if (itr != lookupmap.end()) {
            mappednums.push_back(itr->first);
        }

我希望这能找到一对,但这给我一个错误,说它无法从上面的代码转换参数1。这是错误:

'bool main::<lambda_06927067034dcc4076cc2514a7e290fe>::operator ()(std::pair<int,std::vector<char,std::allocator<char>>> &) const': cannot convert argument 1 from 'std::pair<const _Kty,_Ty>' to 'std::pair<int,std::vector<char,std::allocator<char>>> &'

2 个答案:

答案 0 :(得分:1)

简短答案: 在第一个lambda参数中的const之前添加int

[&](std::pair<const int, std::vector<char>>& aPair)->bool

长答案:

根据std::map reference map<K, V>::iteratormap<K, V>::value_type的迭代器,而map<K, V>::value_typepair<const K, V>(您的情况是pair<const int, vector<char>>

问题是您尝试将pair<int, vector<char>> &引用绑定到类型pair<const int, vector<char>>的值。如果可以的话,您将能够对地图中的键进行突变,从而完全破坏地图的内部结构。因此,您不允许对其进行突变,并且在const中将其表示为pair<const int, vector<char>>

答案 1 :(得分:0)

您尚未为lambda正确声明参数。应该是

[&](std::pair<const int, std::vector<char>>& aPair)

请注意const int是该对的第一类。映射的值类型(以及取消引用映射迭代器时所获得的值)具有该对常量的第一个成员,因为一旦更改了键值,映射就可能破坏用于保存索引的树结构中的排序。地图。

避免此类问题的一种方法是使用

[&](LookupMapType::value_type &aPair)

(其中“ LookupMapType”是lookupmap的类型)。

如果您的编译器支持C ++ 14或更高版本(并在需要时将其启用),则可以将其简化为

[&](auto &aPair)