2013-08-03 4 views
1

반복기를 사용하여 벡터의 마지막 요소를 지우려고합니다. 하지만 요소를 지울 때 분할 오류가 발생합니다. 내 반복에 문제가벡터의 마지막 요소를 지울 때 세그먼트 오류

for (vector<AccDetails>::iterator itr = accDetails.begin(); itr != accDetails.end(); ++itr) { 
    if (username == itr->username) { 
      itr = accDetails.erase(itr); 
    } 
} 

있습니까 : 아래

내 코드?

+2

중복 가능성 (http://stackoverflow.com/questions/8628951/remove-elements-of-a-vector-inside-the-loop) – Borgleader

답변

5

이 제거/삭제 관용구에 적용 할 수있는 좋은 장소입니다 : 보너스로

accDetails.erase(
    std::remove_if(
     accDetails.begin(), accDetails.end(), 
     [username](AccDetails const &a) { return username == a.username; }), 
    accDetails.end()); 

을,이 조금 더 빨리 무슨 일을했다 (또는 어쩌면 아주 조금보다 더 빨리 될 가능성이 높습니다, 벡터가 큰 경우). 각 항목을 개별적으로 지우는 것은 O (N)로 끝나지 만 N이 커지면 O (N)이됩니다.

당신이 C++ (11)를 사용할 수없는 경우 별도로 그 비교 인코딩해야하므로, 람다가 작동하지 않습니다 : 또는

class by_username { 
    std::string u; 
public: 
    by_username(std::string const &u) : u(u) {} 
    bool operator()(AccDetails const &a) { 
     return u == a.username; 
    } 
}; 

accDetails.erase(
    std::remove_if(accDetails.begin(), accDetails.end(), by_username(username)), 
    accDetails.end()); 

을 당신이 당신의 AccDetails 클래스 operator==를 오버로드 할 수 있습니다, , 비교를 처리합니다. 예를 들면 다음과 같습니다.

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <string> 
#include <iterator> 

class AccDetail { 
    std::string name; 
    int other_stuff; 
public: 
    AccDetail(std::string const &a, int b) : name(a), other_stuff(b) {} 

    bool operator==(std::string const &b) { 
     return name == b; 
    } 

    friend std::ostream &operator<<(std::ostream &os, AccDetail const &a) { 
     return os << a.name << ", " << a.other_stuff; 
    } 
}; 

int main(){ 
    std::vector<AccDetail> ad = { {"Jerry", 1}, { "Joe", 2 }, { "Bill", 3 } }; 

    std::cout << "Before Erase:\n"; 
    std::copy(ad.begin(), ad.end(), std::ostream_iterator<AccDetail>(std::cout, "\n")); 
    ad.erase(
     std::remove(ad.begin(), ad.end(), "Joe"), 
     ad.end()); 

    std::cout << "\nAfter Erasing Joe:\n"; 
    std::copy(ad.begin(), ad.end(), std::ostream_iterator<AccDetail>(std::cout, "\n")); 
} 
+0

I 이 줄'[username] ...'에서 * 기본 표현 * 오류가 발생했습니다. 그래서 구조체에 operator()를 써야하나요? –

+0

@JoelSeah : 편집 된 답변보기. –

-1

내 리더의 요소를 지우는 안전한 방법을 배웁니다. 첫째, 모든 요소를 ​​찾으십시오. 둘째, 하나씩 지우십시오.

queue< vector<AccDetails>::iterator > q; 
for (vector<AccDetails>::iterator itr = accDetails.begin(); itr != accDetails.end(); ++itr) { 
    if (username == itr->username) { 
     //itr = accDetails.erase(itr); 
     q.push(itr); 
    } 
} 
while(!q.empty()){ 
    vector<AccDetails>::iterator itr = q.front(); 
    accDetails.erase(itr); 
    q.pop(); 
} 
[루프 내부 벡터의 요소를 제거]의
+0

다른 리더를 찾아야합니다. 이 코드는 완전히 깨졌습니다. – DanielKO

+0

@DanielKO, 당신은 단지 코드를 복사하여 실행할 수 없습니다. 난 그냥 방법, 그런 종류의 문제를 다루는 방법을 보여 – msheng

+0

알고리즘이 잘못되었습니다. 2 차 시간 알고리즘 일뿐만 아니라 첫 번째 요소가 모두 삭제 된 후에 지워지는 모든 요소입니다. 심지어 시퀀스 외부를 액세스 할 수도 있습니다. 이것을 사용하여 벡터 {1, 2, 3, 4, 5, 6}의 모든 짝수를 지우십시오. – DanielKO