我使用Visual Studio 2013编译非常简单的代码:
std::set<int> a{ 1, 2, 3 };
std::remove(a.begin(), a.end(), 3);
我希望这不会出错,但我很惊讶。错误发出:
Error 1 error C3892: '_Next' : you cannot assign to a variable that is const c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm
怎么会这样? a是非const std :: set。 std :: remove()移动它的元素,看起来完全合法。
在VS 2008中,下面类似的代码编译时没有错误:
std::set<int> a;
std::remove(a.begin(), a.end(), 3);
答案 0 :(得分:4)
该集合是非const的,但是set::begin()
,set::end()
返回一个const_iterator。可以看出on cppreference。
我认为这是为了避免“局外人”能够交换元素作为集合的不变量之一是所有元素都被排序(这正是std::remove
所做的,它会移动元素以便您可以调用之后擦除它,请参阅erase-remove idiom)
如果要删除元素,请使用erase成员函数。
答案 1 :(得分:0)
std::remove
适用于vector
和list
等线性容器,而非set
等已排序的容器。 (考虑:remove
交换元素。甚至意味着什么交换set
的元素?)
听起来你想要std::set::erase
。