CPP_어소_59_STL(vector, list)

CJB_ny·2022년 7월 2일
0

CPP_AROTHO

목록 보기
58/83
post-thumbnail

Standard Template Library

표준 C++ 라이브러리 (Standard Template Library)프로그램에 필요한 자료구조와 알고리즘을 Template로 제공하는 라이브러리
출처: https://blockdmask.tistory.com/67 [개발자 지망생:티스토리]


STL구성요소 ❗❗❗

1. Container 

객체를 저장하는 객체, 자료구조 라고도 한다. 클래스 템플릿으로 구현되어있다.

container는 크게 sequence container, associative container로 나뉩니다.

Container 종류

  • Sequence Container 의 종류 : array (C++ 11), vector, list, deque

  • Associative Container 의 종류 : set, multiset, map, multimap

2. iterator

포인터와 비슷한 개념으로 컨테이너의 원소를 가리키고, 가리키는 원소에 접근하여 다음 원소를 가리키는 기능. 순회

3. Algorithm

정렬, 삭제, 검색, 연산 등을 해결하는 일반화된 방법을 제공하는 함수 템플릿.

4. Function Object

함수처럼 동작하는 객체로 operator() 연산자를 오버로딩 한 객체.
컨테이너와 알고리즘 등에 클라이언트 정책을 반영한다.

5. Container Adaptor

구성요소의 인터페이스를 변경해 새로운 인터페이스를 갖는 구성 요소로 변경.

Container Adaptro의 종류

  • stack, queue, priority queue

6. Allocator

컨테이너의 메모리 할당 정책을 캡슐화한 클래스 객체로 모든 컨테이너는 자신만의 할당기를 가지고 있다.

iterator 동작 방식 보기

표준 라이브러리에서 제공해주는 가변배열

#include vector

표준 라이브러리에서 제공해주는 연결형 리스트

#include list

이거 두개 다 당연히 "템플릿"이다.

vector에는 당연히 push_front없는데

배열에서 앞에다 넣는다?? => ㅈㄴ 비효율적

앞에다가 데이터를 넣을 것이였으면

당연히 리스트가 효율적이다.

이렇게 at이라는 함수도 존재.

그런데 이렇게 데이터를 저장하면

내가 vector라는 객체에다가 저장하는게 아니라

이녀석도 "가변배열"이라 Heap 메모리를 가르키고

그 녀석에게 데이터를 넣는다.

그때의 첫번째 주소를 (데이터 시작 주소를) 반환하는데

이 주소를 뽑아?오는 함수가 vector.data();

16번째 줄 처럼 반환이 T* 로주면 끝.

vector 함수

  • 현재 기준으로 크기

    vector.size();

  • 현재 기준으로 몇칸 까지가 허용범위 인지.

    vector.capacity();

list 의 경우

함수 부분이

list.capacity 빼고 vector랑 똑같음.

당연히 capacity는 없다. => 생각.

노드로 연결 -> 연결 -> 연결 하니까.

우리가 따라하지 못한거 iterator

반복자.

리스트에는 당연하게도

[ ]라는 operator(연산자)를 제공하지 않는다.

메모리가 연속작이지 않기 때문에

size_t == 8byte == __int64 == longlong

vector

순회 하는 방법이다.

list는?? ❗❗

vector처럼 순회하고싶다

=> iterator를 제공한데

집어 넣은 데이터를 순회 할 수 있는 키워드.

list<int>::iterator iter;

list라는 클래스내에 클래스가 또 정의되있는 형태이다.

inner class라고한다.

listInt.begin() =>

iter라는 변수는 listInt의 첫번째 데이터를 가르키고 있다라고 생각하면된다.

지금 int iData = *iter로

뭔가 포인터를 역참조해서 그 값을 받아오는 듯한 느낌이다.

그런데 지금 list안에 들어잇는 첫번째 데이터를 iter로 받아와서

그것을 역참조해서 iData에다가 값을 넣어주는 중.

이거는 지금 포인터가 아니라,

"클래스의 객체" 이다.

그럼, '*'는 뭐냐? =>

연산자 오버로딩이다.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글