Проблемы с remove_if в VS2010 при использовании наборов - PullRequest
6 голосов
/ 05 июля 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;
}

Который под VS2005 использовал для компиляции нормально. Однако, используя VS2010, я получаю следующую ошибку:

Ошибка 1, ошибка C3892: «_Следующий»: нельзя присвоить переменную const c: \ program files \ microsoft visual studio 10.0 \ vc \ include \ алгоритма

Если я сделаю контейнер вектором, все будет хорошо.

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

1 Ответ

6 голосов
/ 05 июля 2010

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

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

...