gpt4 book ai didi

c++ - 左值在使用 std::map 时指定 const 对象

转载 作者:可可西里 更新时间:2023-11-01 16:34:35 28 4
gpt4 key购买 nike

我正在尝试使用 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 函数中传递了 val,但我无法理解为什么调用 opertor =。你能解释一下我做错了什么吗?

最佳答案

您不能将 std::remove_if 与关联容器一起使用,因为该算法的工作原理是用后续元素覆盖已删除的元素:这里的问题是映射的键是常量,以防止您(或 std::remove_if 算法)弄乱容器的内部排序。

要有条件地从 map 中删除元素,请执行以下操作:

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

这是一个live example .

关于c++ - 左值在使用 std::map 时指定 const 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16333178/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com