2016-08-10 7 views
0

std::mapのファンクタのstd::pairの値のコピーを避ける方法はありますか(私はそれが何であるか推測しています)。でも、C++ 11の両方のケースでは、ラムダfind_ifとmapのファンクタ

auto it = std::find_if(mRTMap.begin(), mRTMap.end(), 
    [](const std::pair<guid, RadioTransmitterInformation> &t) -> bool { 
    return t.second.mPropagationServer.mRequestNumber == 24031; 
    } 
); 

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

、私は常に値を検索しながら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)); 

おかげ

答えて

6
const std::pair<guid, RadioTransmitterInformation> &t 

mapのvalue_typeには常にconstというキーが格納されます。しかし、あなたのpairは、キーをconstとして保存しません。したがって、あなたの関数を呼び出すには、内部のpairの値を一時的にコピーしなければなりません。const&のパラメータに束縛されます。したがって、ラムダを呼び出した後に削除されます。

代わりに、使用:

const std::pair<const guid, RadioTransmitterInformation> &t 

あるいはさらに良い:マップがある場合は

const auto &t 
+0

'decltype'バージョンはどうですか?マップは実際に 'map 'ですか?あなたは[mcve]を投稿しなかったので、私は確信できません。 –

+0

まあまあ、私は大きな間違いを犯しました。あなたの答えは私の問題を解決しました。どうもありがとう! – Ceros

2

const decltype(mRTMap)::value_type &t 

あるいはさらに良い-ERあなたがC++ 14を持っている場合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&を試してみてください。

関連する問題