我有以下代码。
#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
如果我将容器变成矢量,一切都很好。
我猜测标准中的某些内容已经发生了变化,我不知道,有人可以说明为什么这种情况不再有效吗?
答案 0 :(得分:6)
std::set
始终按排序顺序保留其元素。 std::remove_if
尝试将您不想删除的元素移动到集合的开头。这将违反集合按行排序维护元素的不变性。
代码永远不应该有效。较旧的编译器可能没有足够严格地强制执行规则,以便让您知道它不应该工作,但(显然)是您当前的规则。