2010-07-05 20 views
6

kullanarak. VS2005 altında cezası derlemek için kullanılan Sorunları Ben kodu aşağıdakilere sahip setleri

#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; 
} 

. '_Next': Eğer const c olan bir değişkene atanamıyor: 1 hata C3892

Hata: \ Program Files \ 10.0 \ vc \ dahil microsoft visual studio \ algoritma

Ancak aşağıdaki hatayı alıyorum VS2010 kullanarak Ben kabını bir vektör yaparsanız

, her şey yolunda.

Farkında olmadığım standartta bir şeylerin değiştiğini tahmin ediyorum, birisi neden artık işe yaramadığını açıklayabilir mi?

cevap

6

A std::set hep sıralanmış sırayla öğelerini tutar. std::remove_if, istemediğiniz öğeleri koleksiyonun başına taşımaya çalışır. Bu, kümenin öğelerin sıralı sırada tutulması değişmezini ihlal eder.

kod asla çalışmış olmalıdır. Eski derleyiciler, kuralların, çalışması gerekmediğini bilmenizi sağlayacak kadar sıkı bir şekilde zorlamamış olabilir;

+0

Ben bunu düşünmek zaman çok açık varsayalım. Bence VC6 VS2005 ve şimdi VS2010 için sürüklemediyseniz büyük projeyi, dönüştürme edilmiştir ve birçok minik hatalar var. Zihinsel kod blokumu kaldırdığın için teşekkürler. Vs2005'in oldukça katı olduğunu düşünüyordum, sanırım vs2010 kadar katı değil. – Rich

+0

Bunun için bir çözüm var mı? Remove_if yerine kullanabileceğim bir şey var mı? – julienln

+2

@julienln: İstenmeyen öğeler olmadan yeni bir kap oluşturmak için 'std :: remove_copy_if' kullanabilir ya da öğeleri tek tek arayabilir ve silebilirsiniz. –