9

以下の例のように std::map を使用しようとしています。

#include <map>
#include <algorithm>

int wmain(int argc, wchar_t* argv[])
{
    typedef std::map<int, std::wstring> TestMap;
    TestMap testMap;
    testMap.insert(std::make_pair(0, L"null"));
    testMap.insert(std::make_pair(1, L"one"));
    testMap.erase(std::remove_if(testMap.begin(), testMap.end(), [&](const TestMap::value_type& val){ return !val.second.compare(L"one"); }), testMap.end());
    return 0;
}

そして私のコンパイラ(VS2010)は私に次のメッセージを与えます:

>c:\program files\microsoft visual studio 10.0\vc\include\utility(260): error C2166: l-value specifies const object

1>          c:\program files\microsoft visual studio 10.0\vc\include\utility(259) : while compiling class template member function 'std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(std::pair<_Ty1,_Ty2> &&)'
1>          with
1>          [
1>              _Ty1=const int,
1>              _Ty2=std::wstring
1>          ]
1>          e:\my examples\с++\language tests\maptest\maptest\maptest.cpp(8) : see reference to class template instantiation 'std::pair<_Ty1,_Ty2>' being compiled
1>          with
1>          [
1>              _Ty1=const int,
1>              _Ty2=std::wstring
1>          ]

lambda-function で val を参照渡ししているのに、opertor = が呼び出される理由がわかりません。私が間違っていることを説明していただけますか?

4

1 に答える 1

13

連想コンテナでは使用できませんstd::remove_if。そのアルゴリズムは、削除された要素を後続の要素で上書きすることによって機能するためです。ここでの問題は、マップのキーが定数std::remove_ifであることです。これは、ユーザー (またはアルゴリズム) が内部順序を台無しにするのを防ぐためです。コンテナの。

条件付きでマップから要素を削除するには、次のようにします。

for (auto iter = testMap.begin(); iter != testMap.end();)
{
    if (!iter->second.compare(L"one")) // Or whatever your condition is...
    {
        testMap.erase(iter++);
    }
    else
    {
        ++iter;
    }
}

これが実際のです。

于 2013-05-02T08:17:36.963 に答える