如何将copy_if用于地图

时间:2014-05-08 17:02:33

标签: c++ algorithm map copy

我正在尝试使用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)); }

我得到的错误:

  1. 错误C3499:已指定具有void返回类型的lambda无法返回值

  2. 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“

  3. 错误C2039:'second':不是'std :: map&lt; _Kty,_Ty&gt;'的成员

  4. 谢谢你的帮助!

1 个答案:

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