2011-10-09 4 views
1

문자열의 왼쪽과 오른쪽에서 공백을 제거하는 두 개의 한 줄 함수를 작성하려고합니다. 왼쪽 측면은 문제가되지 않았다 :공백 제거/반복자 변환

void trimLeft(string &s) { 
    s.erase(s.begin(), find_if(s.begin(), s.end(), (int (*)(int))isgraph)); 
} 

하지만 오른쪽에 비슷한 시도 할 때 :

void trimRight(string &s) { 
    s.erase(find_if(s.rbegin(), s.rend(), (int (*)(int))isgraph), s.end()); 
} 

을 좀 컴파일러 오류가 있었다. 문제는 find_if에 의해 반환되는 reverse_iterator를 일반 iterator로 변환해야한다는 것입니다. 이 작업을 수행하는 방법?

+1

항상 학교 프로젝트의 Boost.StringAlgorithm –

+1

에서'trim'있다, 나는 부스트를 사용할 수 없습니다. – Adi

+1

왜'isgraph'를 캐스팅하고 있습니까? –

답변

2

base() 멤버 함수를 사용하면 reverse_iterator에서 기본 iterator를 복구 할 수 있습니다.

void trimRight(string &s) { 
    s.erase(find_if(s.rbegin(), s.rend(), (int (*)(int))isgraph).base(), s.end()); 
} 
+0

고마워, 작동 해 :) – Adi

1

문서를 보면, string :: erase가 reverse_iterators를 잘 처리해야합니다. 문제는 역방향 및 전달 반복기를 혼합한다는 것입니다. 따라서 시도해보십시오

void trimRight(string &s) { 
    s.erase(s.rbegin(), find_if(s.rbegin(), s.rend(), (int (*)(int))isgraph)); 
} 

편집 : Nope.

+0

나는 나를 위해 일하지 않는다. 컴파일러 오류. 'std :: basic_string , std :: allocator >에 대한 호출에 대한 일치 함수가 없습니다. :: 지우기 (std ... – Adi

+0

@Adi 전체 오류 메시지를 제공 할 수 있습니까? –

+0

오류 : 아니요 'std :: basic_string , std :: allocator > :: std :: reverse_iterator <__ gnu_cxx :: __ normal_iterator , std :: allocator >>, std :: reverse_iterator <__ gnu_cxx :: __ normal_iterator , std :: allocator > ... – Adi