2008-09-27 3 views
10

3 인수 양식 list::splice()은 하나의 요소를 한 목록에서 다른 목록으로 이동합니다. SGI's documentation은 이동중인 요소를 가리키는 모든 이터레이터 이 유효 함을 명시 적으로 나타냅니다.은 유효합니다. Roguewave's documentationsplice() 메서드의 반복자 무효화 속성에 대해서는 아무 말도하지 않는 반면 C++ 표준에서는 모든 반복자와 연결되는 요소에 대한 참조를 무효화한다고 명시 적으로 명시하고 있습니다.std :: list 및 iterator invalidation에서 splice()

실제로 SGI에서 정의한대로 splicing()이 작동하지만 디버그/보안 SCL 버전의 Microsoft의 STL 구현 (엄격히 표준의 문자를 따름)에서 어설 션 오류 (잘못된 반복자 참조 취소)가 발생합니다.

목록을 가리키는 반복자의 유효성을 유지하면서 목록간에 요소를 이동하려는 경우 정확하게 목록을 사용하고 있습니다. 이 표준은 원래 SGI의 사양에 매우 도움이되지 않는 변화를 가져 왔습니다.

이 문제를 해결하려면 어떻게해야합니까? 아니면 그냥 실용적이고 스플 라이스가 내 머리를 모래에 집어 넣어야합니까? (이 아니기 때문에은 실제로 반복자를 무효화합니다. 반복자 디버깅이 꺼지면 MS 구현에서조차도 안됩니다.)

+0

큰 질문입니다. 마지막 단어는 무엇입니까? –

+0

표준은 바보 같지만 오른쪽입니다. 표준 준수 프로그램에서 스플 라이스를 사용하지 마십시오. 아마도 C++ 1x가 상황을 수정했을 것입니다. 나는 체크하지 않았다. – zvrba

+5

방금 ​​확인했는데 변경되었습니다. 보유 된 표현은 LWG 결함 250 중 하나입니다. 예전 반복기는 유효하며 새 컨테이너를 가리키는 것처럼 동작합니다. –

답변

9

좋아,이 표준에 결함이있는 것 같습니다 thisthis 링크. 그것은 새로운 라이브러리 버전에서 수정 될 것이므로 "모래 속에 머리를 꽂는 것"은 좋은 전략입니다.

2

이터레이터가 여전히 이동 된 요소를 가리키는 경우 이전에 "이동 된"이터레이터와 연결된 "끝"이터레이터가 변경된다는 점이 문제입니다. 복잡한 루프를 작성하지 않는 한 실제로 이것은 나쁜 일입니다. 특히 다른 개발자가 이해하기가 더 어려울 것이기 때문입니다.

내 생각에 더 나은 방법은 이동 된 반복자 앞뒤에있는 요소를 가리키는 반복자를 사용하는 것입니다.

+0

목록 조작 능력을 잃지 않고 반복자를 요소에 액세스 할 수 있는지 여부 또는 현재 목록을 반복하는지 여부에 따라 달라지며,이 경우 실제로주의해야합니다. – Fruny

0

목록 배열 (요소의 동등한 클래스)이 있으며 목록간에 요소를 이동하기 위해 스플 라이스를 사용하고 있습니다. 목록의 요소에 직접 액세스하고 다른 목록으로 이동하는 반복자 배열이 있습니다. 목록은 동시에 검색 및 수정되지 않습니다. 내가 splice 후 요소 iterator를 다시 초기화 할 수 있지만 좀 못 생겼어. 나는 당분간 그렇게 할 것 같아요.