为什么std :: remove需要const版本的迭代器?

时间:2015-05-14 15:34:32

标签: c++ visual-studio c++11 visual-studio-2013

我使用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);

2 个答案:

答案 0 :(得分:4)

该集合是非const的,但是set::begin()set::end()返回一个const_iterator。可以看出on cppreference

我认为这是为了避免“局外人”能够交换元素作为集合的不变量之一是所有元素都被排序(这正是std::remove所做的,它会移动元素以便您可以调用之后擦除它,请参阅erase-remove idiom

如果要删除元素,请使用erase成员函数。

答案 1 :(得分:0)

std::remove适用于vectorlist等线性容器,而非set等已排序的容器。 (考虑:remove交换元素。甚至意味着什么交换set的元素?)

听起来你想要std::set::erase