使用集合时VS2010中remove_if的问题

时间:2010-07-05 16:09:57

标签: visual-studio-2010 visual-studio-2005 stl set

我有以下代码。

#include <set>
#include <algorithm>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 typedef set<long> MySet;

 MySet a;

 for( int i = 0; i < 10; ++i)
 {
  a.insert(i);
 }

 MySet::iterator start,end,last;

 start = a.begin();
 end = a.end();

 last = remove_if(start,end,bind2nd(less_equal<long>(),5));

 return 0;
}
在VS2005下用哪个编译好了。但是使用VS2010我收到以下错误:

错误1错误C3892:'_ Next':您无法分配给const c的变量:\ program files \ microsoft visual studio 10.0 \ vc \ include \ algorithm

如果我将容器变成矢量,一切都很好。

我猜测标准中的某些内容已经发生了变化,我不知道,有人可以说明为什么这种情况不再有效吗?

1 个答案:

答案 0 :(得分:6)

std::set始终按排序顺序保留其元素。 std::remove_if尝试将您不想删除的元素移动到集合的开头。这将违反集合按行排序维护元素的不变性。

代码永远不应该有效。较旧的编译器可能没有足够严格地强制执行规则,以便让您知道它不应该工作,但(显然)是您当前的规则。