如何在map中使用copy_if函数

3

我正在尝试使用 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:指定为无返回值类型的lambda不能返回值

  2. IntelliSense:类“std :: map(std :: string,std :: pair(float,float),std :: less(std :: string),std :: allocator(std :: pair(const std :: string,std :: pair(float,float>>>>)>> >”没有成员“second”

  3. 错误 C2039:“second”:不是“std :: map <_Kty,_Ty>”的成员

感谢您的帮助!

1个回答

4

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

@user3617423 Manhattan_Distance本身是一个lambda吗?如果是,你需要捕获它-copy_if谓词应该是[Manhattan_Distance](decltype(...)...。如果不是这种情况,请更新问题,展示Manhattan_Distance的定义以及它在调用copy_if时的定义位置。 - Praetorian
谢谢你的帮助。 这是函数:bool Search::Manhattan_Distance(const pair& the_pair) { return (_radius >= fabs(_citymap[_city].first - the_pair.first) + fabs(_citymap[_city].second - the_pair.second)); } - user3617423
@user3617423 看起来 Manhattan_DistanceSearch 类的非静态成员函数。假设 copy_if 调用发生在同一类的另一个成员中,你需要捕获 this 指针才能调用其他成员函数。因此,你的 lambda 表达式应该是 [this](decltype(...)... - Praetorian
@user3617423 是只有Intellisense错误,还是也出现了编译器错误(带有Cxxx标识符的错误消息)?如果只是前者,你可以忽略它们。否则,你需要发布更多的代码和来自编译器的错误消息,并指出错误发生在哪些行。 - Praetorian
@user3617423 【那应该可以运行】(http://coliru.stacked-crooked.com/a/15009991b4e98c05)。尝试编译链接的示例,如果可以,请继续向“Manhattan_Distance”添加更多代码,使其看起来像您的实际函数,直到出现错误。 如果仍然无法解决问题,我会建议您发布一个新问题。 以我的示例为起点。 - Praetorian
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接