글과 사진, 그리고 이야기

IE & SWCON/Data Structure (C++)

반복자

뱃놀이가자 2024. 2. 14. 16:38
728x90

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=257288899

 

코딩 테스트를 위한 자료 구조와 알고리즘 with C++

C++ 자료 구조부터 그리디 알고리즘, 분할 정복 알고리즘, 그래프 알고리즘, 동적 계획법과 같은 다양한 알고리즘을 설명한다. 또한, 전통적인 자료 구조와 C++ STL 클래스 구현 사이의 관계를 설명

www.aladin.co.kr

본 책을 사용하여 공부하는 내용이고 해당 글은 상업적으로 배포하고자 하지 않고 개인 공부용입니다

 

  • 포인터와 비슷한 주소 비스무리한 그걸 반복자라고 함
  • STL 컨테이너에 대해 공통의 인터페이스를 제공함
  • 벡터와 배열에서 사용되는 반복자는 기능 면에서 가장 유연함
  • 벡터와 배열은 연속된 자료 구조를 사용하기 때문에 특정 위치의 원소에 곧바로 접근할 수 있음, 이러한 경우 임의 접근 반복자(random access iterator)라고 부름
  • 한편, 기본적으로 forward_list는 역방향 긴응을 제공하지 않아서 이전 노드로 돌아가려면 -가 아니라 맨 처음 노드부터 시작해서 찾아가야 함
  • 이렇게 역방향을 지원하지 않는 증가 연산만 가능한 반복자를 순방향 반복자(forward iterator)라고 함
  • 반복자 타입에 따라서 advance, next, prev 함수가 있는데 주의할 점은 해당 반복자가 지원할 경우에만 동작한다는 점
  • 그러니까, 순방향으로만 이동이 가능한 순방향 반복자에 대해서 prev( ) 함수를 사용하는 에러가 발생함

반복자 예제

 

#include <iostream>
#include <forward_list>
#include <vector>

int main()
{
	std::vector<std::string> vec = {
	"Lewis Hamilton", "Lewis Hamilton", "Nico Roseberg", "Sebastian Vettel", "Lewis Hamilton", "Sebastian Vettel", "Sebastian Vettel", "Sebastian Vettel", "Fernando Alonso"
	};

	auto it = vec.begin();  // 상수 시간
	std::cout << "가장 최근 우승자: " << *it << std::endl;
	//Lewis Hamilon
	it += 8;                // 상수 시간
	std::cout << "8년 전 우승자: " << *it << std::endl;
	// Fernando Alonso
	advance(it, -3);        // 상수 시간
	std::cout << "그후 3년 뒤 우승자: " << *it << std::endl;
	//Sebastian Vettel
}

 

솔직히 좀 쉬움

 

    std::forward_list<std::string> fwd(vec.begin(), vec.end());
    
    auto it1 = fwd.begin();
    std::cout << "가장 최근 우승자: " << *it1 << std::endl;
    
    advance(it1, 5); // 선형 시간
    std::cout << "5년 전 우승자: " << *it1 << std::endl;
    
    // std::forward_list는 순방향으로만 이동할 수 있으므로
    // 아래 코드는 에러가 발생합니다.
    // advance(it1, -2);
}

참고참고

 

 

728x90

'IE & SWCON > Data Structure (C++)' 카테고리의 다른 글

list  (0) 2024.02.14
forward_list  (1) 2024.02.14
vector  (2) 2024.02.07
array class  (1) 2024.02.07
연속된 자료 구조와 연결된 자료구조  (1) 2024.02.07