TIL 2024/09/09

Sung Joo Lee·2024년 9월 9일

Enum


유저가 정의한 데이터 타입으로 이름과 정수형 상수가 짝을지어 이루어져 있다. 이러한 자료구조는 여러가지 선택지가 필요할 때 사용하면 좋다.

#include <iostream>

enum Day { //사용자 정의 data type
	sunday = 0 ,
	monday = 1,
	tuesday = 2,
	wednesday = 3,
	thursday = 4 ,
	friday = 5,
	saturday = 6
};

int main()
{
	Day today = sunday; // enum 객체 선언

	switch (today)
	{
	case sunday: 
		std::cout << "It is Sunday!\n";
		break;
	case monday:
		std::cout << "It is Monday!\n";
		break;
	case tuesday:
		std::cout << "It is tuesday!\n";
		break;
	case wednesday:
		std::cout << "It is Wednesday!\n";
		break;
	case thursday:
		std::cout << "It is thursday!\n";
		break;
	case friday:
		std::cout << "It is friday!\n";
		break;
	case saturday:
		std::cout << "It is saturday!\n";
		break;
	}

	return 0;
}

위와 같이 스위치 문에 today의 값에 따라서 결과물이 달라지게 만들어주었다. Enum은 숫자와 짝을 지어서 정의한 data type이기 때문에 case를 숫자로 해도 사용 가능하다. 하지만 굳이 가독성이 떨어지게 사용하지는 말자.

enum Flavor
{
	vanilla,//0
	chocolate,//1
	strawberry,//2
	mint//3
};

enum Planet
{
	mercury = 4880,
	venus = 12104,
	earth = 12756,
	mars = 6794
};

또한 enum은 짝 지을 숫자를 지정 할 수 있고 지정하지 않을 수 있는데 지정하지 않을 시 자동으로 0 부터 짝이 지어진다.

STL


  • Standard Template Libaray의 약자로 템플릿을 사용한 컨테이너의 집합

    • 컨테이너 : 데이터를 저장하기 위한 객체
    • 자료구조와 알고즘이 내부적으로 구현이 되어있는 라이브러리
  • 널리 사용되는 자료구조와 알고리즘이 구현되어 있음

  • 시간 복잡도는 레퍼런스 문서에서 찾아 볼 수 있음

  • 강력하고 적용 및 재 사용성이 좋다!

  • 궁금하면 공식문서 찾아보자! 모든 내용을 다 알 수 있다.

구성요소

  • 컨테이너

    • 객체 또는 기본 자료형의 집합
    • array, vector , deque , stack ,set, map , etc.
    • 각 컨테이너는 관련된 헤더 파일 포함 필요 ( #include <컨테이너 이름>)
  • 알고리즘

    • 컨테이너의 요소들을 다루기 위한 알고리즘
    • find, max ,count,accumulate, sort,etc.
      • 원래 우리가 구현했어야 했던 자료구조들 및 알고리즘이 다 구현이 되어있음
  • 반복자 (iterators)

    • 컨테이너의 요소들에 대한 순회 및 접근
    • 반복자를 사용하는 이유
      • set, map 같은 경우에 연속된 메모리 공간에 저장하지 않을 수 있음. 우리는 내부에서 어떻게 찾아가는지 알 필요는 없으나 데이터를 사용하기 위해서 반복자를 사용하여 데이터를 찾는다.
    • forward, reverse, by value , by reference , constant , etc.

컨테이너 종류

  • Sequential 컨테이너

    • 삽입 순서를 유지하는 컨테이너
    • array, vector , list , forward_list , deque
  • Associative 컨테이너

    • 순서가 없거나 , 미리 정해진 규칙에 따라 저장하는 컨테이너
    • 내가 데이터를 입력한 순서와는 상관없이 임의적으로 알아서 메모리에 저장시킴
    • set ,multi set, map, multi map
  • 컨테이너 어댑터

    • 다른 컨테이너들의 변형 응용
    • stack, queue, priority queue

컨테이너 공통 기능

  • 이들이 자연스럽게 외워지도록 많이 사용해 보자
    • swap()
    • erase()
    • clear()
    • size()
    • empty()
    • insert()

컨테이너 특징

  • 요소는 복사되어 컨테이너에 저장됨

    • 기본 자료형은 모두 ok
  • 사용자 정의 자료형 ( 클래스)는 복사가 가능하고, 대입이 가능해야 함

    • 즉, 복사 생성자 / 대입 연산자 필요 ! ← 포인터 멤버 변수가 없을 때는 ok
    • 있다면 깊은 복사 구현해야 함
  • Associative 컨테이너의 경우, 비교 연산을 수행할 수 있어야 함

    • 즉, operator<, operator == 오버로딩 필요!
profile
개발로그

0개의 댓글