2016-03-25 20 views
0

yüzden şöyle vektörleri tutan bir vektör vardır:yanlış lambda kullanımı

vector<vector<int>> vec; 

Ve vec içinde vektörler yineleme ve silinen olsun vektörleri belirlemek için (Sonr) bir karşılaştırıcı kullanmaya çalışıyorum remove_if ve sil. Kodum şu ana kadar aşağıdaki gibidir:

vector<vector<int>> deleted_vecs;  

vec.erase(remove_if(vec.begin(), vec.end(), 
           ([vec, pred](vector<int> x) { 
           if (pred(x)) { 
            return true; 
           } 
           else { 
            deleted_vecs.push_back(x); 
            return false; 
           } 
           }, 
           vec.end()))); 

Burada yanlış bir şey var mı?

Derleyici hatalarım, "if (önceki (x))" ve "deleted_vecs.push_back (x);" Önceden bir vektörü almayı planladım ve bir vektör olarak delete_vecs ilan ettiğim halde, pred ve push_back ile eşleşen bir işlev çağrısı olmadığını söyleyin. Bu, x'i nasıl beyan ettiğimin bir sorun olduğunu düşünmeme neden oluyor, ancak emin değilim.

Herhangi bir yardım için teşekkür ederiz!

+1

parantez kullanımınızı kontrol edin. –

+0

@JoachimPileborg oops, bu benim kodumdaki bir yazım hatasıydı. Ancak, düzeltdiğimde sorun hala devam ediyor. – user5482356

+0

Sen * vec'i yakalamama * gerek yok, ama 'delete_vecs' 'i yakalaman gerek. Referans olarak, "delete_vecs" dosyasının bir kopyasına öğeler ekleyeceksiniz ve programınızın geri kalanı asla görmeyecektir. –

cevap

0

Yakalama listesiyle birlikte parantez içinde de bir hata var.

Kullanılan değişkenleri, nesnelerin kopyalanmasında biten değere göre yakalıyorsunuz. Değişkenleri değer yerine değil, referans olarak yakalamaya çalışın. Örneğin http://en.cppreference.com/w/cpp/language/lambda

bkz:

vec.erase(
    std::remove_if(vec.begin(), vec.end(), 
    [&](std::vector<int> x) { 
     if (pred(x)) { 
     return true; 
     } 
     else { 
     deleted_vecs.push_back(x); 
     return false; 
     } 
    }), 
    vec.end()); 
+0

Teşekkürler, bu çalışma sona erdi. – user5482356