It won't hurt to try

[C++/윈도우프로그래밍응용]25. STL 컨테이너 본문

카테고리 없음

[C++/윈도우프로그래밍응용]25. STL 컨테이너

yongki.doki 2021. 11. 4. 08:56

STL 컨테이너

01. 컨테이너

컨테이너(Container)

컨테이너란, 데이터를 저장하는 클래스

  • 복잡한 데이터 구조를 쉽게 구현하는 데에 도움
  • 템플릿을 사용하여 구현
    • 서로 다른 자료형의 객체를 저장하는 데에 사용 가능

<일반적인 컨테이너의 목록>

컨테이너 설명
벡터(vector) 동적 배열처럼 동작, 뒤에 자료 추가
큐(Queue) 데이터가 입력된 순서대로 출력되는 자료 구조
스텍(Stack) 먼저 입력된 데이터가 나중에 출력되는 자료 구조
우선순위 큐 큐의 일종, 큐의 요소들이 우선순위가 있어 우선순위가 높은 요소가 먼저 출력되는 자료 구조
리스트(List) 벡터와 유사, 중간에 자료 추가 연산이 효율적
맵(Map) 키-값(key-value) 형식으로 연관 탐색 가능

02. 컨테이너의 분류

컨테이너의 분류

순차 컨테이너

  • 자료를 순차적으로 가지고 있음
  • 자료의 추가나 삭제는 빠르지만, 탐색할 때 시간 소요 많음

연관 컨테이너

  • 사전(dictionary)과 같은 구조로 자료를 저장
  • 원소를 검색하기 위한 키(key)를 가지며, 자료는 정렬됨
  • 자료의 추가/삭제에 시간이 걸리나, 자료의 탐색이 빠름

컨테이너 세부 분류

컨테이너 순차 시퀀스 벡터(vector) 동적 배열
리스트(list) 인덱스 순차적인 배열
덱(deque) 인덱스 맨앞, 맨뒤에 데이터 입력 가능
연관 시퀀스 집합(set) 집합
맵(map) dictionary형

03. 컨테이너의 공통 멤버 함수

컨테이너의 공통 멤버 함수

컨테이너의 공통 멤버 함수

함수 설명
Container() 기본생성자
Container(size) 크기가 size인 컨테이너 생성
Container(size, value) 크기가 size이고 초기값이 value인 컨테이너
Container(iterator, iterator) 다른 컨테이너로부터 초기값의 범위 받아 생성
begin() 첫 번째 요소의 반복자 위치
clear() 모든 요소 삭제
empty() 비어있는 지 검사
end() 반복자가 마지막 요소를 지난 위치
함수 설명
erase(iterator) 컨테이너의 중간 요소 삭제
erase(iterator, iterator) 컨테이너의 지정된 범위를 삭제
insert(iterator, value) 컨테이너 중간에 value를 삽입
pop_back() 컨테이너의 마지막 요소를 삭제
push_back(value) 컨테이너의 끝에 데이터를 추가
rbegin() 끝을 나타내는 역반복자
rend() 역반복자가 처음을 지난 위치
size() 컨테이너의 크기
operator=(Container) 대입 연산자의 중복 정의

반복자

01. 반복자

반복자(iterator)

컨테이너의 요소를 가리키는 객체

  • 기존의 포인터 개념과 비슷
  • 일반화 된 포인터(generalized pointer)
  • 컨테이너의 종류 상관없이 일관된 방법으로 요소 접근 가능

반복자를 사용하는 곳

  • 컨테이너 요소에 접근하여 읽기/쓰기가 필요한 경우

시퀀스(sequence)

시퀀스 : 반복자의 핵심 개념

  • 시퀀스에는 시작(begin)과 끝(end)이 있음
  • 처음부터 끝까지 순회할 수 있으며, 중간 요소의 읽기/쓰기 또한 가능

반복자의 종류

전향 반복자(forward iterator)

  • 전방향으로만 진행, ++ 연산자만 사용 가능

양방향 반복자(bidirectional iterator)

  • 전후 방향 진행 가능, ++, -- 연산자 모두 사용 가능

무작위 접근 반복자(random access iterator)

  • ++ 연산자와 --연산자, [] 연산자 사용 가능

반복자에서 사용할 수 있는 연산자

연산자 설명
++ 컨테이너에서 다음 요소를 가리킴
-- 컨테이너에서 이전 요소를 가리킴
==, != 두 반복자가 같은 요소를 기리키는지 비교
* 반복자가 가리키는 요소의 값을 추출하는 역참조 연산자

반복자의 예시

vector에서 반복자를 사용하는 경우

vector<int> scores;
vector<int>::iterator it;
for (it = v.begin(); it != v.end(); ++it)
  cout << *it << endl;
  • it의 초기값은 v.begin()을 통해 얻음
  • it의 현재 위치가 마지막 위치인지 비교하기 위해 != 연산자 사용가능
  • ++연산자를 이용해서 반복자 전방향 이동

vector에서 반복자를 사용하는 경우(auto 사용)

vector<int> scores;
for (auto it = v.begin(); it != v.end(); ++it)
  cout << *it << endl;
  • C++14 이후부터는 auto 키워드를 이용하여 반복자의 자료형을 복잡하게 선언하지 않고도 구현 가능

vector에서 auto + 범위기반루프를 사용하는 경우

vector<int> scores;
for (auto & n : v)
  cout << n << endl;
  • C++14 이후부터는 범위 기반 루프를 사용하여 반복자를 사용하지 않고 값을 읽어들일 수 있음
  • 그러나 컨테이너 중간에 데이터를 삽입하거나 데이터를 삭제하는 등의 작업을 위해서는 반복자 필요
300x250
300x250
Comments