2010-07-15 4 views
2

여기에서 StackOverflow 및 기타 소스에서 제거 기능의 동작은 단순히 원래 컨테이너를 다시 정렬하므로 제거 할 요소가 컨테이너의 끝으로 이동되어 삭제되지 않습니다. 그것들은 컨테이너의 일부로 남아 있으며 remove() 함수는 단순히 유지할 요소 범위의 끝을 정하는 반복자를 반환합니다.STL remove() 함수의 동작 - 컨테이너 요소 만 재정렬 하시겠습니까?

그래서 '제거 된'값이있는 컨테이너의 부분을 실제로는 잘라내 지 않으면 여전히 존재해야합니다.

그러나 아래 코드를 실행하면 '제거되지 않은'영숫자 문자 뒤에 공백이 없습니다.

int main() 
{ 
    std::string test "this is a test string with a bunch of spaces to remove"; 
    remove(test.begin(), test.end(), ' '); 
    std::cout << test << std::endl; 

    return 0; 
} 

여기 무슨 일이 일어나고 있습니까? 필자는 test.erase()를 호출하지 않아서 문자열에 후행 공백이 없어야합니까? remove()를 호출 한 후에 'removed'항목이 여전히 존재한다는 것을 보장합니까?

PS- 나는 문자열에서 공백을 제거하는 방법에 대한 제안을 찾고 있지 않습니다. 위의 것은 단순히 혼동을주는 remove() 비헤이비어의 예입니다.

+0

알고리즘은 일반적으로 모든 반복기 범위에서 작동하지만 요소를 이동하는 알고리즘 ('partition','remove', ...)은 정렬/색인화에 사용해서는 안됩니다. 컨테이너. –

+0

위의 내용을 조금 더 자세히 설명 할 수 있습니까? 인덱싱 된 컨테이너는 인덱싱 할 수 있음을 말합니까? [] 연산자를 지원하는 컨테이너입니까? 내가 이해하는 한, 컨테이너를 손으로 정렬하고 remove()를 실행하면 제거되지 않은 요소, 즉 컨테이너 앞쪽으로 이동 한 요소가 순서를 유지합니다. 예 : 소스 문자열 "qwertyasdf" 정렬 오름차순 준다 "adefqrstwy" 삭제/술어 잎 'dfqrstw'을 찾는 모음과 관용구를 제거는, 알파벳 순서는 그대로 유지. 나는 당신이 의미하는 것을 오해하고 있습니까? – MTLPhil

답변

1

remove으로 전화를 건 후에 컨테이너 끝 부분에 남아있는 것이 반드시 제거 된 요소 일 필요는 없습니다. 그냥 쓰레기 야. 대부분 "제거하라는 요청이 있기 전에 그 위치에 있던 것은 무엇이든지"이지만 그 중 하나에 의존 할 수는 없습니다. 초기화되지 않은 변수와 매우 비슷합니다. 아무 것도 될 수 있습니다.

예를 들어, 문자열 :

"Hi I am Bob!\0" 

remove의 호출에 공백이 제거하는 후 아마는이

"HiIamBob!\0b!\0" 

당신은 cout에 그 표시되지 않습니다 같습니다 하지만 '\ 0'에 도달하면 인쇄가 중단되기 때문입니다.

+0

좋아, 그건 내가 뭘 의심 한거야. 내가 본 문서 (http : //www.cplusplus.co.kr/reference/algorithm/remove /)은 그들이 남아 있고 액세스 할 수 있다고 확신합니다. 구현 특정 될 수있는 정의되지 않은 동작의 사례 중 하나 였을 수도 있습니다. – MTLPhil

+0

그럴 수도 있습니다. 구현과 관련 있다고 생각했지만 문서가 저와 모순되는 것 같습니다 (cplusplus.com이 항상 가장 정확한 리소스는 아닙니다). 어느 쪽이든, 새로운'end' 후의 컨테이너 내용은 확실히 제거되지 않은 요소입니다. –

+0

추가 한 예를 보았습니다. 좋은 지적. 감사. – MTLPhil

0

Boost.String을 기꺼이 받아보십시오.

문자열에 작용하는 알고리즘 모음입니다.

관련 문제