모든 stl 컨테이너가 스왑 알고리즘의 전문화를 제공하여 기본 생성자가 사용하는 복사 생성자와 두 할당 작업을 호출하지 않도록합니다. 그러나, 일부 코드에서 큐를 사용하는 것이 좋을 때 나는 큐와 큐와는 달리이 메서드를 제공하지 않는다는 것을 알았습니다. 방금 대기열 대신 양각 공법을 사용하기로 결정 했는데도 여전히 이것이 왜 있는지 알고 싶습니다.std queue가 스왑 메서드 전문화를 정의하지 않는 이유
답변
C++0x은 std :: queue와 같은 컨테이너 어댑터에 스왑을 추가합니다. 현재 표준에서 빠진 이유를 추측 할 수만 있습니다. this discussion 사람에서 는 해결 방법을 제안한다 : 표준이 필요한 부분 보호, 라는 유산을 만드는 것이므로 해결책이 있습니다
. [그냥 표준 어댑터를 통해 파괴하지 마십시오] 원하는 어댑터를 상속받은 템플릿 기반 구조체를 만들고, 생성자를 제공하고 어댑터 클래스에 args를 전달합니다. 스왑 멤버 작성은 필요한 항목이 보호 된 멤버이므로 스냅입니다 표준 어댑터.
나는 그것이 감독으로 빠져 나갔을 것입니다. 모든 공평성에서 나는 std :: queue와 std :: stack을 꽤 많이 사용하고 결코 두 개를 교환 할 필요가 없다. 대기열 대신 deque를 사용하는 것이 좋습니다. typedef std::deque<MyType> QueueType
과 같은 것은 컨테이너를 사용해야하는 방법에 대한 충분한 힌트를 제공해야합니다.
처리를 필요로하는 두 세트의 요소, 즉 현재 세트와 다음 라운드에서 처리 할 세트를 유지 관리하고 있으므로 각 라운드의 끝에서 고갈 된 currentQueue 대신 채워진 nextQueue를 교환해야합니다. 엄밀히 말하면 대기열 일 필요는 없습니다 ... 실제로는 벡터 일 수 있습니다 ... hmmm –
대기열에 대한 포인터가 두 개인 것으로 생각하고 대신이를 바꿔 놓았습니까? – rlbond
@rlbond 스왑 메서드가 올바르게 정의되었을 때 컨테이너는 내부 포인터를 바꿀 뿐이므로 효과가 똑같습니다 ... 벡터 사용은 싫어요
질문은 "누락 된 이유가 무엇입니까?" –