Scott Meyers "Effective STL”에서 erase-remove idiom
(항목 32)을 읽었을 때이 질문을 받았습니다.지우기 지우기 관용구 : 지우기 전에 지우개를 제거하면 어떻게됩니까?
vector<int> v;
...
v.erase(remove(v.begin(), v.end(), 99), v.end());
remove
은 기본적으로 범위의 "새 논리 끝"에서 시작하고 범위의 실제 끝에서 삭제하는 요소가 될 때까지 계속 "새 논리 끝"원래 범위의 요소를 반환 . 용기
좋은 소리 이제 내 질문 물어 보자 :.. 위의 예에서
, remove
가 v.end()
99 경우가 vector v
에없는 반환 할 수 있습니다 기본적으로 방법을 지울 past-the-end-iterator
을 통과
past-the-end-iterator
이erase
방법으로 전달되면 어떻게됩니까? 표준이 그것을 UB라고합니까? 이것에 대한 어떤 아이디어
vector<int> v;
...
vector<int>::iterator newEndIter = remove(v.begin(), v.end(), 99);
if(newEndIter != v.end())
{
v.erase(newEndIter, v.end();
}
: 그것은 정의되지 않은 동작 인 경우
erase-remove idiom
예처럼 보였다해야?
정의에 따르면 v.end()는 'past-the-end'가 아니며 끝입니다. x –
@Matthieu M. std :: vector :: end()의 설명서는 다음과 같이 설명합니다. "반복기를 반환합니다. 벡터 컨테이너의 past-the-end 요소를 참조하십시오. " –
@ Julien-L : 그건 나쁜 표현입니다. 마지막 반복자는 한 요소를 지나치는 요소입니다. C++ 사양이 실제로 그렇게 말하고 있습니까? 그것은 놀랄 것입니다. –