2012-11-24 3 views
3

오늘은 아주 간단한 것이지만, 몇 시간 동안 저를 괴롭혔습니다. 내 문자열 반복기의 부제에 문제가 있다고 생각합니다. 나는 온라인에서 보았고 코드를 CSE 교수에게 넘겨주었습니다.하지만 추수 감사절의 휴식과 함께, 그는 단지 그의 전화를 가지고 많은 도움을 줄 수 없었습니다.반복자를 사용하여 문자열에서 특수 문자를 제거하십시오.

누군가가 이것을보고 즉시 문제를 파악할 수 있기를 바랍니다. 참고로, 필자의 목표는 단순히 문자열에서 특수 문자를 제거하는 것입니다. 이 문자열은 참조로 함수에 전달됩니다 (반환 유형이 필요하지 않음). 추가 참고 사항으로, 나는 이것을 가능한 한 효율적으로 유지하려고 노력하고 있습니다. 나의 원래 생각은 단순히 for를 for 중첩 된 for 루프로 변경하는 것이었지만 CSE 교수는 문자열 반복자가있는 for 루프가 일부 특수한 경우에 더 효율적이라는 것을 유지하므로이를 준수해야합니다. 아무도 도와 줄 수 있으면 알려주세요 !!

제거 기능에는 remove가 char *가 아닌 const char *을 사용하므로 문제가 있다고 생각됩니다. text.begin()이 const가 아니므로이 문제가 발생한다고 가정합니다. 그러나 함수의 문자열을 & 문자열로 만들면 참조로 텍스트를 수정할 수 없습니다. 메인에서

을 우리가 가지고 :

string temp = "~cool~"; 
XML * parser = new XML(); 
parser->clearSpecialChars(temp); 
cout << temp; 

및 기능은 다음과 같습니다

void XML::clearSpecialChars(string &text) 
{ 
    char chars[]= ".,!()1234567890[]'<>:/{}_|=+;-`~"; 
     for (unsigned int i = 0; i < 33; ++i) 
     { 
      text.erase(std::remove(text.begin(),text.end(),chars[i]),text.end()); 
     } 
} 

그러나, 나는 컴파일러 오류가 발생하고 여기에

내가 지금까지 가지고있는 코드입니다 of :

생각은 크게 감사하겠습니다!

+2

"알고리즘"헤더를 포함 시켰습니까? ''remove''라는 또 다른 함수가 있는데''const char *''를 매개 변수로 받아들입니다. – hinafu

답변

1

하드 코드 "33"나에게 싫증이 나다합니다 : 여기에 그들 각각에 대한 설명입니다. '\ x00'을 특수 문자 집합에 포함 시키시겠습니까?

최신 C++ 오프 로딩은 가능한 경우 라이브러리 루틴을 루프합니다. 다음은 다른 구현입니다.

void XML::clearSpecialChars(string &text) 
{ 
    const string chars = ".,!()1234567890[]'<>:/{}_|=+;-`~\x00"; 

    auto new_end = std::remove_if(text.begin(), text.end(), 
     [chars](string::value_type c) 
      { return chars.find(c) != string::npos; }); 
    text.erase(new_end, text.end()); 
} 
+0

우리는 이전에 strlen을 가지고 있었고 특별한 문자가 변경되지 않았기 때문에 ''을 포함하지 않고 33을 하드 코딩함으로써 공간을 절약 할 수 있기 때문에 변경되었습니다. 하루가지나면서 반복자가 점점 더 인기를 얻고있는 것처럼 보입니다. 속도를 높이는 데 도움이되는 좋은 독서를 권할 수 있습니까? –

+0

Matthew Austern의 "Generic Programming and STL"은 제가 아는 최고의 소스입니다. – user515430

관련 문제