2015-07-02 8 views
24

मैं एक कार्यक्रमवेक्टर :: मिटा (हटाने (....)) काम नहीं कर रहा

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

इस विशिष्ट उदाहरण के लिए के साथ आया था, मेरे जीएनयू gdb उबंटू कहा गया है कि return 1 लाइन पर: है a = {2,3,7,1,5,4} जो अपेक्षित नहीं है (केवल एक 1 हटा देता है), और b = {7,4,3,3,1} जो अपेक्षा नहीं है।

मेरी उम्मीद a और ba=2,3,7,5,4 और b=7,4,3,3,1,7 होना चाहिए।

यहां क्या हो रहा है?

उत्तर

31

std::remove संदर्भ द्वारा तीसरा तर्क लेता है और यह उस सीमा में संदर्भों को अमान्य करता है जो इस पर काम करता है (इस अर्थ में कि यह चारों ओर सामान बदलता है और इस प्रकार सीमा में तत्वों के मूल्यों को बदलता है)। समस्या यह है कि आप कॉल के दौरान a[0], संदर्भ तर्क बदलते हैं, जो आपको नहीं करना चाहिए।

इसे ठीक करने के बजाय एक प्रति पारित:,

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

वैकल्पिक रूप से बदल

a.erase(remove(a.begin(), a.end(), 1), a.end()); 
b.erase(remove(b.begin(), b.end(), 6), b.end()); 
संबंधित मुद्दे