2016-10-10 6 views
0

std::reverse(c.begin(), c.end())은 기본 컨테이너 c양방향 반복기을 제공해야하는 이유는 무엇입니까?왜 std :: reverse에는 양방향 반복기가 필요합니까?

사실상 이것은 (multi-) map, (multi-) set을 의미하지만, 주문되어 있기 때문에 역전 될 수 없습니다. 유일한 다른 양방향 디렉토리 컨테이너는 list이지만 그 자신의 멤버 함수는 .reverse()입니다.

이 하나 array, vector 및 랜덤 액세스있다 dequestd::reverse에 적용 할 수 있다는 것을 의미한다.

그래서 "정직"하고 말하십시오 : 임의 액세스가 필요합니까? 아니면 멤버 함수를 사용해야합니까?

+6

사용자 정의 반복자에 대해 불필요한 제한이 있으므로 – krzaq

+0

@krzaq로 생각했습니다. 그러나 출하 된 잠재적 목표의 80 %에 특정 기능을 적용 할 수 없다는 것이 이상하다고 생각했습니다. 나는 아마도 "주문한"또는 무엇인가라고 말하는 이터레이터 - 카테고리를 직교 또는 직각으로 발명했을 것이다. Esp. non-applicability가 ref-pages에'std :: reverse'를위한 doc에 언급되어 있지 않기 때문입니다. 어쩌면 사양 자체에 있을까요? – towi

+0

'map' 또는'set'을'merge'-target (출력 반복자 필요)로 사용할 수 있습니까? 'map'과'set'에서'remove'를 사용하는 것은 어떻습니까? 아마도 순서가 바뀌기 때문에 아마 그렇지 않을 것입니다. – towi

답변

2

이렇게하면 bidireactional iterator를 사용하는 사용자 정의 반복기 또는 공동 작성자에게 불필요한 제한이 있습니다. 또한 랜덤 액세스가 필요하지 않으므로 필요하지 않아야합니다.

+1

또는 양방향 반복기를 사용하여 사용자 정의 컨테이너. – juanchopanza

3

사용자 정의 반복기를 사용할 필요가 없어도 사용자가 직접 질문 할 수 있습니다.

유일한 다른 BI-DIR 용기 list이지만 하나는 자신의 멤버 함수 .reverse()있다.

그러나 멤버 함수는 전체 목록을 뒤집습니다. std::reverselist.begin()list.end() 이외의 다른 반복기를 전달하여 목록의 일부만 되돌릴 수 있습니다.

+0

좋은 지적입니다. 나는 그것을 간과하고있다. – towi