2012-09-20 2 views
0

반복자가 같은 요소를 가리키고있는 상황을 의미합니다.C++ list.erase (it, it)가 무언가 지울 수 있습니까? 좋은 참고 자료를 어디에서 찾을 수 있습니까?

http://www.cplusplus.com/reference/stl/list/erase/에서 "목록 컨테이너에서 단일 요소 (위치) 또는 요소 범위 ([첫째, 마지막)]를 제거합니다."라고 말합니다. 및 "first, last 목록 컨테이너에서 제거 할 범위를 지정하는 반복자 : [first, last). 즉, 범위에는 first와 last 사이의 모든 요소가 포함됩니다. 마지막."

모든 것을 잘못했는지는 모르겠지만 코드의 모든 부분에 대해 필요한 정보를 어디서나 찾지 못하고 직접 테스트하고 싶을 때 상황이 끝나면 끝납니다. 무슨 일이 있었는지 알고 여기에 물어보고 오랜 시간 동안 논쟁을하면 "정의되지 않은 행동"과 같은 것을 발견하게됩니다. 누군가가 나를 더 빨리 도울 수 있습니까? 지금은 무엇입니까?

그리고 저는 더 나은 프로그래머가되고 cplusplus.com 및 cppreference.com보다 더 나은 소스를 찾고 싶습니다. 왜냐하면 둘 다 빨기 때문입니다. 더 좋은 점이 있습니까? 나는이 C++로 매일 더 미쳐 가고있다. (하지만 여전히 자바 나 C보다 빠른 거대한 프로그램이 더 낫다고 생각한다.) 제발 도와 줘.

+3

왜 그냥 시도해 보지 않으시겠습니까? 목록을 만들고, 중간 반복자를 가져오고, erase()를 호출하고, 나중에 내용이 무엇인지 확인하십시오. – riwalk

+1

@ 루카스 참조를 원한다면 표준을 참조하는 것은 어떻습니까? – Mahesh

+2

목록을 채우고 인쇄하고 지우기 (it, it)를 호출하고 목록을 다시 인쇄하는 것은 어떻습니까? – TeaOverflow

답변

9

범위의 표준 자신의 정의 (24.2.1p7 강조 광산) : 데이터 구조에서 작동 도서관의 알고리즘 템플릿의 대부분

이 범위를 사용하는 인터페이스를 가지고있다. 범위은 계산의 시작과 끝을 지정하는 한 쌍의 반복자입니다. 범위 [i,i)은 비어있는 범위입니다; 일반적으로 범위 [i,j)i이 가리키는 요소로 시작하고 j이 가리키는 요소까지 포함하지만 포함하지 않는 데이터 구조의 요소를 나타냅니다.

그래서 it을 가정하는 것은 유효한 반복자 또는 lst의 과거 - 더 - 끝, 전화 lst.erase(it,it)lst의 요소의 빈 세트를 삭제합니다. 즉, 아무것도하지 않습니다.

+0

사실이면서 "The Standard 자체 정의"를 어디에서 찾을 수 있을까요? –

+1

http://stackoverflow.com/questions/81656을 참조하십시오. – aschepler

2

당신이 반복자가 어떻게 작동하고 모든 것이 [처음, 마지막으로]가 아닌 다른 것으로 전달되는지에 대해 생각해 보는 것이 가장 좋습니다.

명심해야 할 이터레이터에는 두 가지 핵심 규칙이 있습니다. 하나를 늘릴 수 있습니다 (즉, 첫 번째 ++). 동일한 요소를 가리키는 두 개의 반복자는 항상 동일합니다. 이것을 알면 논리를 사용하여 반복자의 모든 범위를 반복 할 수 있습니다.

for(; first != last; first++) 
{ 
} 

그래서 첫 번째와 마지막 값이 같으면 아무 일도 일어나지 않습니다. 그래서 list.erase (it, it)를 호출하면 아무 것도 지울 수 없습니다.

좀 더 일반적인 형식으로 작성하십시오. 처음 == last 인 STL의 모든 범위는 실제로 비어 있습니다.

+0

그래, 나도 그럴 줄 알았지 만 어떻게 그렇게 확신 할 수 있니? 쓰여진 곳은 어디입니까? 목록 기능을 살펴 보셨습니까? –

+0

@LukasSalich 표준이 무엇을 말하는지 상관없이, 코드를 작성하고 컴파일하고 실행하는 것이 가장 좋은 방법입니다. –

+1

@ LukasSalich 컴파일러가 표준을 구현하는지 확신 할 수 없습니다. –