여기에서 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() 비헤이비어의 예입니다.
알고리즘은 일반적으로 모든 반복기 범위에서 작동하지만 요소를 이동하는 알고리즘 ('partition','remove', ...)은 정렬/색인화에 사용해서는 안됩니다. 컨테이너. –
위의 내용을 조금 더 자세히 설명 할 수 있습니까? 인덱싱 된 컨테이너는 인덱싱 할 수 있음을 말합니까? [] 연산자를 지원하는 컨테이너입니까? 내가 이해하는 한, 컨테이너를 손으로 정렬하고 remove()를 실행하면 제거되지 않은 요소, 즉 컨테이너 앞쪽으로 이동 한 요소가 순서를 유지합니다. 예 : 소스 문자열 "qwertyasdf" 정렬 오름차순 준다 "adefqrstwy" 삭제/술어 잎 'dfqrstw'을 찾는 모음과 관용구를 제거는, 알파벳 순서는 그대로 유지. 나는 당신이 의미하는 것을 오해하고 있습니까? – MTLPhil