2015-07-02 17 views
24

çalışmıyor ben bir program bu özel Örneğinvektör :: silme ((kaldırmak ....))

#include <vector> 
#include <algorithm> 

using namespace std; 

int main() { 
    vector<int> a = {1,2,3,7,1,5,4}; 
    vector<int> b = {6,7,4,3,3,1,7}; 
    a.erase(remove(a.begin(),a.end(),a[0]),a.end()); 
    b.erase(remove(b.begin(),b.end(),b[0]),b.end()); 

    return 1; 
} 

ile geldi, benim GNU gdb Ubuntu return 1 çizgisinde belirtiyor beklemez (yalnızca bir 1 siler) ve beklenmeyen b = {7,4,3,3,1}.

Benim beklentim a ve ba=2,3,7,5,4 ve b=7,4,3,3,1,7 olmalıdır.

Neler oluyor burda?

cevap

31

std::remove üçüncü argümana referans olarak başvurur ve çalıştığı aralıktaki referansları geçersiz kılar (nesnenin etrafını kaydırması ve böylece aralıktaki öğelerin değerlerini değiştirmesi anlamında). Sorun, yapmamanız gereken arama sırasında a[0], referans argümanı değiştirmenizdir.

Bunu düzeltmek için, bunun yerine bir kopyasını pass: Alternatif

a.erase(remove(a.begin(),a.end(),int{a[0]}),a.end()); 
1

değiştirmek

a.erase(remove(a.begin(), a.end(), 1), a.end()); 
b.erase(remove(b.begin(), b.end(), 6), b.end());