我正在尝试使用copy_if复制地图(我想将_citymap复制到_the_cities)。 这是我的代码:
std::map <string, pair <float,float>> _citymap;
copy_if(_citymap.begin(),_citymap.end(),
std::inserter(_the_cities,_the_cities.end()),
[this](decltype(_citymap)::value_type const &kv_pair) {
return (Manhattan_Distance(kv_pair.second));});
函数Manhattan_Distance是一个bool函数:
bool Search:: Manhattan_Distance (const pair <float, float> &the_pair)
{
return (_radius >= fabs(_citymap[_city].first-the_pair.first) +
fabs(_citymap[_city].second-the_pair.second));
}
我得到的错误:
错误C3499:已指定具有void返回类型的lambda无法返回值
IntelliSense:class“std :: map(std :: string,std :: pair(float,float),std :: less(std :: string),std :: allocator(std :: pair) (const std :: string,std :: pair(float,float&gt;&gt;&gt;&gt;“没有成员”second“
错误C2039:'second':不是'std :: map&lt; _Kty,_Ty&gt;'的成员
谢谢你的帮助!
答案 0 :(得分:2)
copy_if
要求谓词接受通过解除引用迭代器(或从该类型可隐式转换的内容)获得的类型的参数,在本例中为map::value_type
,即std::pair<const KeyType, ValueType>
。将lambda表达式更改为:
[](decltype(_citymap)::value_type const& kv_pair) {
return Manhattan_Distance(kv_pair.second);
}
我假设您的Manhattan_Distance()
函数看起来像这样:
bool Manhattan_Distance(std::pair<float, float> const& the_pair)
{ return /* ... */; }
使用C ++ 14,您甚至可以将decltype(...)
部分从参数类型中删除:
[](auto const& kv_pair) {
return Manhattan_Distance(kv_pair.second);
}