find_if和map的函子,避免复制值

时间:2016-08-10 19:10:19

标签: c++

有没有一种方法可以避免副本(我想这是在幕后发生的事情)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));

由于

2 个答案:

答案 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&