C++의 STL에서 반복기가 어떻게 설정되는지 궁금합니다. 세트가 이진 검색 트리를 사용하여 구현되었다고 가정합니다. 즉,이 트리는이 트리를 순회하는 것을 의미합니다. 그러나 내 질문은 그들이 언제 우리가 을 좋아할 때이 traversing을 할 것인가입니다. 그것은 = s.begin() 입니다. 내부적으로 스택의 종류에서 순회 포인터를 저장하고 모든 증가마다이 데이터 구조만을 참조하십시오. 이터레이터 에 있거나 iterator의 증가분은 트리에서 새로운 inorder traversal을 수행합니다. 우리가집합의 반복자는 어떻게 작동합니까?
set<int> s;
set<int>::iterator it;
//and then use it like:
for(it = s.begin(); it!=s.end();)
{
dosth();
++it; // does this do a inorder traversal of the tree again to find the next
// node or it gets the next node in the tree by reading the internal
// data structure(of inorder traversal) which is created when we do s.begin().
}
답장을 보내 주셔서 감사합니다 ....하지만 다른 방법으로 내 질문을 넣어 보자. 어떻게하면 표준에 반복자의 증가 작업을 구현할 수 있습니다 : : 당신이 그렇게하도록 요청받은 경우 설정 ... 내부적으로 노드가 구현됩니다 연결된 목록 대신 이진 탐색 트리를 사용하면 ... 매번 증가하는 작업마다이 트리의 inorder 순회를 수행 하시겠습니까 ++ 그렇지 않으면 순서를 저장하고 ++ 할 때마다 이것을 참조하십시오 – raja
@raja : 간단한 연결리스트를 사용하여'std :: set'을 구현할 수 없습니다. 집합에서 요소를 찾는 것은 O (log N)이어야하지만 링크 된 목록에서 요소를 찾는 것은 O (N)입니다. 그것은 반드시 나무입니다. 트리 노드가 그 부모 노드에 대한 포인터를 유지한다면,'it ++'는 완전한 트리 순회없이 항상 다음 값을 찾을 수 있습니다. – MSalters