2016-07-15 1 views
0

내 문자열은 !!(!())입니다. 문자열에서 이중 느낌표를 제거하고 싶습니다.문자열을 사용한 remove_copy 사용

이 작동하지만이이 오류를 위의 라인을 던졌습니다 사용

remove_copy(str.begin(), str.end(),ostream_iterator<string>(cout), "!!"); 

작동하지 않습니다 그것은 모든 외침

remove_copy(str.begin(), str.end(),ostream_iterator<char>(cout), '!');//gives (()) 

을 제거

는/usr// C++/5/비트를 포함 /predefined_ops.h:194:17 : 오류 : ISO C++이 포인터와 정수를 비교하지 못하게 함 [-fpermissive] {return * __ it == _M_value;

OutputIterator remove_copy (InputIterator first, InputIterator last, 
          OutputIterator result, const T& val); 

The function uses operator== to compare the individual elements to val. 

remove_copy

의 문서를 읽기}

+0

참조로 인해 문자열을 특별히 과부하가 발생시키지 않습니다. – chris

+0

@chris ostream_iterator는'template >'을 가지고 있습니다. 즉, 문자열을 사용할 수 있다는 의미입니까? –

+1

@SamidhT string은 문자 목록입니다. remove_copy는 목록을 반복하고 char을 제거합니다. 문자열 목록에서도 작동 할 수 있습니다. – Balu

답변

0

는 그래서 문자열의 모든 문자를 사용하고 발과 비교합니다. 따라서 두 번째 경우에는 작동하지 않습니다.

나는 이런 식 또한

str.erase(str.find("!!"),2); 

문자열이 있는지 확인을하고 결국 "!!" 그렇지 않으면 프로그램 충돌이 발생합니다.

if(str.find("!!") != string::npos) 
    str.erase(str.find("!!"),2); 
+0

@ user4581301 유효한 포인트. 나는 그 대답을 편집했다. –

+0

편집 한 코드는'find'를 두 번합니다. 시간 낭비입니다. 이미 한번 발견했습니다! 다음과 같아야합니다 :'auto pos = str.find ("!!"); if (pos! = string :: npos) str.erase (pos, 2);'또한 문자열에''!! "'가 두 번 이상 나오면 어떻게합니까? ''!!! ''이 있으면 어떨까요? 이것은 문제에 대한 매우 일반적인 해결책은 아닙니다. –

+0

@JonathanWakely 있다면 "!!!" 그것은 당신이 그것을 어떻게 처리하길 원하는지에 달려 있습니다 (!! 2 대 !! 1). 그럼에도 불구하고 나는 여전히 당신에게 동의합니다. 그것은 일반화되거나 효율적이지 않습니다. –

관련 문제