【问题标题】:Problems with remove_if in VS2010 when using setsVS2010中使用set时remove_if的问题
【发布时间】:2010-07-05 16:09:56
【问题描述】:

我有以下代码。

#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 的变量

如果我将容器设为矢量,一切都很好。

我猜我不知道的标准发生了一些变化,有人可以解释一下为什么这不再有效吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我想你想想就明白了。我一直在转换一个大型项目,我们已经将它从 vc6 拖到 vs2005,现在又拖到 vs2010,我有很多微小的错误。感谢您删除我的心理密码块。我觉得vs2005比较严格,估计没有vs2010严格。
    • 您有解决方法吗?有什么可以代替 remove_if 的吗?
    • @julienln:您可以使用std::remove_copy_if 创建一个没有您不想要的项目的新容器,或者您可以单独搜索并删除项目。
    猜你喜欢
    • 2014-08-07
    • 2023-03-21
    • 2023-02-05
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多