有没有一种方法可以避免副本(我想这是在幕后发生的事情)std::pair
中带有std::map
的仿函数的值?
struct request_number_find
{
request_number_find(const unsigned __int64 &baseline) : _baseline(baseline) {}
bool operator() (const std::pair<guid, RadioTransmitterInformation> &arg)
//-------------------------------------- ^^^^^^^^^^^^^^^^^^^^^^^^^^^
{
return _baseline == arg.second.mPropagationServer.mRequestNumber;
}
unsigned __int64 _baseline;
};
即使使用C ++ 11 lambda
auto it = std::find_if(mRTMap.begin(), mRTMap.end(),
[](const std::pair<guid, RadioTransmitterInformation> &t) -> bool {
return t.second.mPropagationServer.mRequestNumber == 24031;
}
);
在这两种情况下,我总是看到RadioTransmitterInformation
的析构函数在搜索值时多次调用。
地图声明:
std::map<guid, RadioTransmitterInformation, guid_compare> mRTMap;
guid_compare:
struct guid_compare {
bool operator() (const guid& lhs, const guid& rhs) const{
return lhs < rhs;
}
};
Find_if电话:
std::find_if(mRTMap.begin(), mRTMap.end(), request_number_find(24031));
由于
答案 0 :(得分:6)
const std::pair<guid, RadioTransmitterInformation> &t
map
的value_type始终将密钥存储为const
。但是,您的pair
此处并未将密钥存储为const
。因此,要调用您的函数,它必须将内部pair
值复制到临时值,该临时值绑定到const&
参数。因此,在调用lambda后会被删除。
相反,请使用:
const std::pair<const guid, RadioTransmitterInformation> &t
甚至更好:
const decltype(mRTMap)::value_type &t
如果你有C ++ 14,那就更好了:
const auto &t
答案 1 :(得分:2)
如果地图的类型为std::map<guid, RadioTransmitterInformation>
,则会存储std::pair<const guid, RadioTransmitterInformation>
类型的值 - 请注意const
。
由于std::pair<guid, RadioTransmitterInformation>
是一个不同的类型,编译器必须生成一个临时的pair
来调用你的仿函数(在任一版本中)。
请尝试使用const std::pair<const guid, RadioTransmitterInformation>&
参数,或者const decltype(mRTMap)::value_type&
。