使用集合时VS2010中remove_if的问题

Ric*_*ich 6 stl visual-studio-2005 set visual-studio-2010

我有以下代码.

#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;
}
Run Code Online (Sandbox Code Playgroud)

哪个在VS2005下用来编译好.但是使用VS2010我收到以下错误:

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

如果我把容器变成矢量,一切都很好.

我猜我的标准中有些东西已经改变,我不知道,有人可以说明为什么这个不再有效吗?

Jer*_*fin 6

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

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

  • @julienln:您可以使用`std :: remove_copy_if`创建一个没有您不想要的项目的新容器,或者您可以单独搜索和删除项目. (2认同)