在此作业中,我正在制作一个应用程序,其中用户输入电话号码(无论它是否是字母)。
我尝试在地图或矢量上使用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>>> &'
答案 0 :(得分:1)
简短答案:
在第一个lambda参数中的const
之前添加int
:
[&](std::pair<const int, std::vector<char>>& aPair)->bool
长答案:
根据std::map reference map<K, V>::iterator
是map<K, V>::value_type
的迭代器,而map<K, V>::value_type
是pair<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)