문제

STL에서는 거의 모든 컨테이너에 삭제 기능이 있습니다.내가 가진 질문은 벡터에 관한 것입니다. 지우기 함수는 벡터의 다음 요소를 가리키는 반복자를 반환합니다.지도 컨테이너는 이 작업을 수행하지 않습니다.대신 void를 반환합니다.왜 이런 불일치가 발생하는지 아는 사람이 있나요?

도움이 되었습니까?

해결책

보다 http://www.sgi.com/tech/stl/Map.html

MAP는 새로운 요소를지도에 삽입하는 것이 기존 요소를 가리키는 반복자를 무효화하지 않는 중요한 속성을 가지고 있습니다.맵에서 요소를 지우는 것은 물론 지우는 요소를 가리키는 반복자를 제외하고는 반복자를 무효화하지 않습니다.

지우기 시 반복자를 반환하는 이유는 목록 지우기 요소를 반복할 수 있기 때문입니다.항목을 지워도 기존 반복자가 무효화되지 않으면 이를 수행할 필요가 없습니다.

다른 팁

erase 반환합니다 iterator C++11에서.이것은 ~ 때문이다 결함 보고서 130:

표 67(23.1.1)에서는 컨테이너::erase(iterator)가 반복자를 반환한다고 나와 있습니다.표 69(23.1.2)에서는 이 요구 사항 외에도 연관 컨테이너에서 컨테이너::erase(iterator)가 void를 반환한다고 명시하고 있습니다.그것은 추가 사항이 아닙니다.이는 요구 사항 변경으로 인해 연관 컨테이너가 컨테이너 요구 사항을 충족하지 못하게 되는 결과를 낳습니다.

표준위원회는 다음을 받아들였습니다.

LWG는 반환 유형이 void가 아닌 반복자여야 한다는 데 동의합니다.(Alex Stepanov도 동의합니다.)

(LWG = 도서관 실무 그룹).

불일치는 사용으로 인해 발생합니다. vector 요소에 대한 순서가 있는 시퀀스입니다.사실이지만 map 또한 일부 비교 기준에 따라 정렬되지만 이 순서는 구조에서 분명하지 않습니다.한 요소에서 다음 요소로 이동하는 효율적인 방법은 없습니다(효율적 = 일정한 시간).사실, 지도를 반복하는 것은 꽤 비용이 많이 듭니다.반복자의 생성이나 반복자 자체는 전체 트리를 탐색하는 작업을 포함합니다.이 작업은 다음에서 수행할 수 없습니다. 영형(N), 스택을 사용하지 않는 한 필요한 공간은 더 이상 일정하지 않습니다.

전체적으로, 지운 후 "다음" 요소를 반환하는 저렴한 방법은 없습니다.시퀀스의 경우 ~이다 떨어져 있는.

게다가 Rob이 옳습니다.Map이 반복자를 반환할 필요가 없습니다.

여담이지만, MS Visual Studio C++(Dinkumware IIRC)와 함께 제공되는 STL은 다음과 같은 맵 구현을 제공합니다. erase 반복자를 다음 요소로 반환하는 함수입니다.

그들은 그것이 표준을 준수하지 않는다는 점을 지적합니다.

이것이 답인지는 모르겠지만, 한 가지 이유는 다음 요소를 찾는 데 드는 비용 때문일 수 있습니다.맵을 통한 반복은 본질적으로 "느립니다".

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top