Проблемы с remove_if в VS2010 при использовании наборов

У меня есть следующий код.

#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': Вы не можете присвоить переменной, которая является константой c:\program files\microsoft visual studio 10.0\vc\include\algorithm

Если я делаю контейнер вектором, все прекрасно.

Я предполагаю, что что-то изменилось в стандарте, о котором я не знаю, кто-то может пролить некоторый свет на то, почему это больше не работает?

6
задан sth 5 July 2010 в 23:44
поделиться

1 ответ

A std :: set всегда сохраняет свои элементы в отсортированном порядке. std :: remove_if пытается переместить элементы, которые вы не хотите удалять, в начало коллекции. Это нарушит инвариант набора о поддержании элементов в отсортированном порядке.

Код никогда не должен был работать. Старые компиляторы, возможно, не применяли правила достаточно строго, чтобы вы знали, что это не должно было работать, но (по-видимому) ваш текущий работает.

6
ответ дан 17 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: