2014-04-25 5 views
1

벡터에서 항목을 제거하는 데 사용하고자하는 구조체가 있는데 항목이 표시 될 색인이 무엇인지 알 수 없으므로 값으로 제거합니다. 구조체에서 '=='연산자를 오버로드하는 방법은 무엇입니까?

abc.erase(std::remove(abc.begin(), abc.end(), IsUnderScore()), abc.end()); 

내가 더이 말을하지 않는 컴파일러 오류가 발생합니다 : 내가 지금처럼 벡터에 사용하려고하면 내가하지만 문자열에서 값을 제거하려면이 구조체를 사용할 수 있습니다

struct IsUnderScore{ 
bool operator()(char c){ 
    return c=='_'; 
} 
}; 

: 여기 내 구조체이다 == 연산자와 일치합니다.

그래서 나는이 연산자 자체를 과부하시켜야하고, 따라서 다른 구현물을 살펴 보는 동안 내 케이스와 일치하는 구현을 찾을 수 없다는 것을 알았습니다. 대부분의 다른 버전에는 구조체에 선언 된 변수가 있습니다. 그러나 이것은 현재의 문자가 밑줄과 일치 하는지를보기위한 간단한 bool입니다. 나는 내 사건과 일치하도록 과부하를 어떻게 만들어야하는지 혼란 스럽다.

편집 : 해당 벡터는 방법에 의해 벡터 문자열입니다.

+0

에서 :

abc.erase(std::remove(abc.begin(), abc.end(), '_'), abc.end()); 

대안 (여기에서도 유용합니다,하지만 당신은 제거하기 위해 어떤 요소를 결정하기 위해 더 복잡한 비교를해야 할 경우에 대비) 'IsUnderScore'에는'operator =='의 구현이 없지만'operator()'의 구현은 없습니다. 그것이 문제일까요? – Codor

+0

@Codor : 아니요, 'remove_if'는 호출 가능 항목 (즉, 함수 또는 '연산자()'가있는 클래스)을 필요로합니다. 'remove'는 술어가 아닌 값과 비교할 것을 기대합니다. 이것이 문제입니다. –

답변

2

문제는 누락 operator==하지,하지만 잘못된 기능 + 인수 쌍을 사용으로 가정하면. remove()항목을 술어가 아닌 3 번째 인수로 취합니다. 술어의 경우 remove_if이 필요합니다. 그래서 다음 중 하나를 수행합니다

std::remove(abc.begin(), abc.end(), '_') 

// or 

std::remove_if(abc.begin(), abc.end(), IsUnderScore()) 

편집

remove의 세번째 매개 변수는 반복자의 값 유형의 타입이다. remove_if에 사용 된 술어의 매개 변수는 동일한 유형을 취합니다. 귀하의 편집에 따라 귀하의 경우는 std::string이므로 적절하게 사용해야합니다. remove_if와 함께 사용하기위한 조건을

std::remove(abc.begin(), abc.end(), "_") 

// or 

std::remove(abc.begin(), abc.end(), std::string("_")) 

또는 업데이트 : 어느 문자열로 remove을 사용하는 당신은 remove 대신 remove_if을 시도하고

struct IsUnderScore{ 
    bool operator()(const std::string &s){ 
    return s == "_"; 
    } 
}; 

// ... 

std::remove_if(abc.begin(), abc.end(), IsUnderScore()) 
+0

첫 번째 방법을 사용하려고 할 때 두 가지 방법을 모두 시도했지만, 위와 같은 오류가 발생했습니다. == 연산자가 오버로드됩니다. 하지만 두 번째 방법을 사용할 때 IsUnderScore() 오류를 호출하는 일치 항목을받지 못합니다. – liquid

+0

@ 리퀴드 그 질문에 언급해야 할 것이지만, 각각의 경우에 * 올린 정확한 * 수정되지 않은 * 오류 메시지를 복사하십시오. * 그들은 동일하다고 생각합니다. – Angew

+0

편집을 참조하십시오. 답변을 읽은 후에 완성되기 전에 제 의견을 게시했습니다. 두 가지 방법 모두 시도해 본 결과 오류가 발생했습니다. – liquid

2

당신은 std::remove을 사용합니다 - 비교기를 세 번째 인수로 사용하지 않고 제거 할 값만 사용합니다. 당신의 abc 벡터 vector<char> 사용

std::remove(abc.begin(), abc.end(), '_') 
0

. (아니면 functor로 remove을 시도하고 char 대신).

가장 간단한 솔루션 :

abc.erase_if(std::remove_if(abc.begin(), abc.end(), IsUnderScore()), abc.end()); 
관련 문제