profile
게임 클라이언트 개발자 지망생의 TIL

[UNSEEN] 테스트 대비 4. C++ 컨테이너들의 동작 원리

시퀀스 컨테이너 : 데이터가 선형적으로 저장되는 컨테이너 1. 벡터(Vector) 동적 배열 구조로, 런타임에 크기를 임의로 변경할 수 있다. 메모리에 데이터가 연속적으로 위치한다. 벡터는 포인터 세 개로 구현되어 있다. 할당된 배열의 시작 주소를 가리키는 포인터 다음에 데이터가 삽입될 위치를 가리키는 포인터 할당된 배열의 끝 주소를 가리키는 포인터 데이터를 삽입하면 빨간 포인터가 가리키는 부분에 삽입되고, 빨간 포인터가 1 증가한다. 벡터의 메모리 할당 방식은 size(실제 사용 메모리 크기)와 capacity(여유분 포함 메모리 크기)로 이루어진다. (항상 size <= capacity) 벡터에 데이터를 삽

2023년 2월 16일
·
0개의 댓글
·

[UNSEEN] 테스트 대비 2. C++ 언어의 특징

1. C++ 언어의 특징 C 언어로 작성된 프로그램과의 호환성 유지 객체 지향 프로그래밍의 개념을 도입(추상화, 상속, 다형성, 캡슐화 등) 타입 체크를 엄격히 하여 실행 시간 오류의 가능성을 줄이고 디버깅을 도움. 실행 시간의 효율성 저하를 최소화 2. C++에 추가된 기능 함수 중복 : 매개 변수의 개수나 타입이 서로 다른 동일한 이름의 함수 선언 가능(오버로딩) 디폴트 매개 변수 : 매개 변수에 값이 전달되지 않는 경우 디폴트 값 전달되도록 함수 선언 가능 참조 : 변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조의 개념을 도입 참조에 의한 호출 : 함수 호출시 참조를 전달할 수 있다. new와 delete 연산자 : 동적 메모리 할당, 해제를 위한 두 연산자 도입 연산자 재정의 : 기존의 연산자에 새로운 연산을 정의할 수 O 제네릭 함수와 클래스 : 함수나

2023년 2월 16일
·
0개의 댓글
·

[C++] cout 소수점 출력 변경

cout의 실수 출력 : cout으로 실수를 출력할 때, 만약 그 수가 큰 수라면 자동으로 지수표기법으로 변경되는 문제가 생긴다. 이 때 정상적으로 출력되도록 하려면 cout << fixed를 사용하면 된다. cout << fixed : 소수점을 고정시켜 사용 cout.precision(n) : n자리까지 소수점을 표현 (n + 1 자리에서 반올림) 아래처럼도 사용 가능 cout.setf(ios::fixed) : cout << fixed와 같은 기능 cout.unsetf(ios::fixed) : fixed를 해제

2023년 2월 3일
·
0개의 댓글
·

[C++] list 컨테이너 사용법

1. C++의 list 컨테이너 : STL에 지정된 list는 Double Linked List(양방향 연결 리스트)로 구현되어 있다. 2. Vector와 List의 차이점 1) Vector 연속적 메모리 미래에 들어갈 요소를 위해 메모리 공간을 선할당 동적으로 확장 및 축소가 가능한 동적 배열로 구현 장점 개별 원소들에 접근 가능 랜덤으로 원소 순회 가능 개별 원소에 대한 접근 속도가 빠르다. 원소를 마지막에 삽입하는 것이 빠르다. 단점 컨테이너 끝이 아닌 곳에 삽입/제거 시 성능 현저히 하락 동적이라 확장 및 축소가 편하나 확장 시 비용이 크다. 2) List 비연속적 메모리 메모리를 선할당 하지 않는다. 근본적인 배열이 존재하지 X, 따라서 원소의 배열이 필요하면 새로운 배열을 만들어 원소들을 추가해야 한다. 장점 컨테이너 어느 위치에서라도 삽입/제거 속도가 빠

2023년 1월 30일
·
0개의 댓글
·

[C++] string replace() 함수 사용하여 문자열 일부 교체

replace() 함수 : 문자열 내의 특정 부분 문자열을 다른 문자열로 교체하는 함수 string.replace(교체하고 싶은 문자열의 위치, 교체하고 싶은 문자열의 길이, 새로운 문자열) 1) 교체하고자 하는 문자열을 find()로 찾아 그 위치를 탐색 2) 찾은 문자열의 위치와 길이, 새로운 문자열을 함수의 인수로 전달해 실행 👁️‍🗨️ 참고 https://popawaw.tistory.com/53

2023년 1월 30일
·
0개의 댓글
·

[C++] erase()와 remove() 함수의 차이

1. remove() 함수 : 주어진 값을 컨테이너 내에서 삭제하고 마지막 인덱스 + 1 (== end)를 반환한다. 단, 이 때 컨테이너의 크기가 실제로 줄어드는 것이 아니라, 삭제되어야 할 원소들의 위치에 유지될 원소들의 값을 덮어 씌우는 것이다. 그래서 컨테이너의 뒤 쪽에 쓸데없는 데이터가 남게 된다. 즉, remove() 함수는 어떤 것도 진짜로 없애지는 않는다. 2. erase() 함수 : remove()와 다르게 실제로 주어진 값을 컨테이너 내에서 삭제하고, 공백을 채우기 위해 뒤의 값들의 위치를 앞으로 당겨온다. 따라서 컨테이너 크기가 삭제된 원소 크기만큼 작아지게 된다. 이 때 상황에 따라 오버헤드가 일어날 수 있다. 총 2가지의 사용 방법이 존재한다. 1) 특정 위치의 원소 제거 2) 특정 범위의 원소 제거 3. erase remove idiom : C++ STL 컨테이너에서 어떤 특정

2023년 1월 29일
·
0개의 댓글
·

[C++] Visual Studio 실행 시간 확인

백준이나 프로그래머스 문제를 풀다보면 실행 시간 초과가 발생하는 경우가 있는데, 이 때 얼마나 초과했는지 궁금할 때가 있어 찾아보았다. 코드의 맨 앞과 뒤에 아래 코드를 첨부하면 실행 시간이 얼마나 걸리는지 ms 단위로 확인할 수 있다. 👁️‍🗨️ 출처 https://bloodstrawberry.tistory.com/27

2023년 1월 26일
·
0개의 댓글
·

[C++] 알파벳 대문자 소문자 변환

1. 아스키 코드 1) 덧셈, 뺄셈 이용 2) 비트 연산(XOR) 이용 2. 라이브러리 함수 tolower(), toupper()

2023년 1월 19일
·
0개의 댓글
·

[C++] priority_queue 컨테이너 사용법

priority_queue 컨테이너 C++에서 제공하는 우선순위 큐 자료구조. 큐에 있는 모든 원소 중에서 가장 큰 값이 top을 유지하도록 설계되어 있음. 내부적으로 Heap의 자료구조를 가짐. 1. 헤더 파일 #include 2. 멤버 함수 push() : 우선순위 큐에 원소를 삽입 pop() : top의 원소를 제거 top() : top에 있는 원소를 반환 (top == 우선순위가 가장 높은 원소) empty() : 우선순위 큐가 비어있으면 true, 아니면 false 반환 size() : 우선순위 큐에 들어있는 원소 수 반환 emplace() : 우선순위 큐에 구조를 삽입 ❗push()와 emplace()의 차이 우선순위 큐에는 구조체를 많이 삽입하게 되는데, push의 경우 오브젝트를 생성 후 삽입해야하기 때문에 불필요한 복사가 많이 발생한다.

2023년 1월 12일
·
0개의 댓글
·

[C++] sort() 함수

sort() 함수 `` 헤더 파일에 선언되어있다. 일련의 자료구조(Array, vector 등)에서 원소를 원하는 기준으로 정렬해주는 함수 intro sort 라는 알고리즘으로 구현되어 있는데, 이는 quick sort, heap sort, insertio sort를 섞어 quick sort의 단점을 보완하여 어떤 상황에서도 O(nlogn)의 시간 복잡도를 가질 수 있다. 아래 예시들에서는 vector 자료구조를 정렬해보고자 한다. 1) 오름차순 정렬 기본적으로 범위만 지정해 줄 때는 자동으로 오름차순으로 정렬이 된다. v.begin(), v.end()와 같이 iterator를 통해 범위를 지정해준다 🖥️ 예제 코드 ✔️ 출력 결과 <img src = "https://velog.velcdn.com/images/doorbals_512/post/0f024f3f-db33-4021

2023년 1월 7일
·
0개의 댓글
·

[C++] string.substr() 함수를 통한 부분 문자열 추출

string.substr() pos 인덱스부터 시작해 len 길이만큼의 문자열을 반환 pos는 기본값으로 0이 지정, len은 기본값으로 npos가 지정 pos에서 시작해서 len 길이만큼의 문자열을 가져온다고 했을 때 문자열의 범위를 벗어난다면 마지막 문자까지만 리턴한다. 🖥️ 예제 코드 인수로 아무 것도 전달하지 않으면 원본 문자열 그대로 반환 인수로 시작 인덱스만 전달한다면 해당 인덱스 ~ 문자열 마지막까지 반환 지정된 범위가 원본 문자열 길이를 벗어나면 오류 없이 문자열 마지막까지만 반환 ✔️출력 결과

2023년 1월 7일
·
0개의 댓글
·

[C++] find() 함수로 특정 값 탐색

1. find() 일련의 자료구조(Array, vector 등)에서 원하는 값을 탐색하는 함수 begin과 end는 iterator 객체가 와야 한다. 범위 내(begin - end)의 원소들 중에서 value와 일치하는 첫번째 원소의 iterator를 리턴한다. 범위 내에 찾고자 하는 값이 없다면 end를 반환한다. 🖥️ 예제 코드 iterator끼리 빼면 두 iterator 사이의 거리(distance)를 반환 == 찾는 원소의 인덱스 => 따라서 3의 iterator - v.begin() = 2 v.end()는 v의 마지막 원소 다음 iterator이기 때문에 그 인덱스는 v의 마지막 인덱스 + 1이다. => 6은 범위에 없는 값이라 v.end()를 반환하므로 v.end() - v.begin() = 5 (== v의 사이즈) ✔️ **출

2023년 1월 7일
·
0개의 댓글
·

[C++] C++에서 split() 함수 구현

split() 함수 하나의 문자열을 여러 문자열로 나누는 함수. 여러 언어에서 split 함수를 지원하지만 C++에서는 기본으로 내장되어있지 않기 때문에 직접 구현해야 한다. sstream string과 stream이 합쳐진 클래스. 사용하기 위해서는 `` 헤더 파일을 선언해줘야 한다. stringstream 객체는 str() 함수 또는 > 또는 getline() 함수를 사용한다. split() 함수 구현 👁️‍🗨️ 참조 https://codecollector.tistory.com/999

2023년 1월 5일
·
0개의 댓글
·

[C++] C++ 입력 함수 정리

1. cin 헤더에 정의되어 있는 입력 스트림 객체이다. 표준 입력 버퍼에서 개행 문자를 제외한 값을 가져온다. 공백이나 개행 문자와 같은 화이트 스페이스 문자 가 있을 시 이전까지의 값만 결과로 받아들인다. 이전까지의 값만 받아들이기 때문에 공백, 개행, 탭 등 화이트 스페이스 문자는 입력 버퍼에 그대로 남아있다. 만약 cin으로 공백이 있는 문자열을 입력 받으면 공백 이전까지의 문자열만 변수에 저장되고 그 이후 부분은 입력 버퍼에 남아있다. 이후 다시 cin을 실행하면 문자열을 입력 받지 않고 입력 버퍼에 있는 값이 자동으로 변수에 할당된다. 2. getline() ❗getline()은 에 속한 cin.getline()과 에 속한 getline() 두 가지로 나뉜다. 1) cin.getline() C 형식 문자열 방식인 마지막 글자에

2023년 1월 5일
·
0개의 댓글
·

[C++] vector 클래스

1. vector 클래스 동적 배열 구조를 C++로 구현한 것으로, 맨 끝에서만 삽입 및 삭제가 일어나는 구조 벡터에 원소가 삽입되고 삭제됨에 따라 동적으로 크기가 변하고 메모리가 연속적이다. 중간 데이터를 삭제하기 위해서는 erase 함수를 사용할 수 있지만, 벡터의 맨 끝 이외에서의 삽입 및 삭제의 경우 비효율적이다. -> 삭제가 빈번하면 연결리스트(Linked List)를 사용하는 것이 효율적. 2. vector의 생성 방법 1) vector의 크기 지정하지 않고 생성 2) vector의 크기 지정하고 생성 3) vector의 크기 지정하고 모두 같은 값으로 초기화 4) vector의 원소를 지정하여 생성 3. vector 클래스 멤버 함수 1) Iterator (반복자) : Iterator를 활용해 vector의 원소에 접근 가능 v.begin() : 벡터의

2023년 1월 3일
·
0개의 댓글
·

[C++] 난수 생성하기

1. rand() 함수 rand() 함수는 0 ~ 32767 사이의 랜덤 정수를 반환한다. 하지만 프로그램을 여러 번 재실행시켜도 결과가 동일하게 출력된다. 2. srand() 함수 위처럼 계속 같은 값이 나오는 이유는 rand() 함수의 경우 특정 seed값을 기준으로 특정 공식을 이용해 난수를 생성하므로, 시드값이 같다면 계속 동일한 결과가 나올 수 밖에 없는 것이다. 때문에 시드값을 변경해주어야 기존과 다른 값을 생성할 수 있는데, 이 시드값을 변경해주는 함수가 바로 srand()이다.

2023년 1월 3일
·
0개의 댓글
·

[C++] pair, tuple 클래스

1. pair 클래스 두 개의 데이터를 쌍으로 묶어서 저장하는 클래스 * pair 클래스 함수 2. tuple 클래스 세 개 이상의 데이터를 묶어서 저장하는 클래스 * tuple 클래스 함수 3. 활용 pair나 tuple은 보통 알고리즘 문제를 풀 때 큐(queue), 스택(stack), 벡터(vector) 등과 함께 사용되는 경우가 많다.

2023년 1월 2일
·
0개의 댓글
·

[C++] string 클래스

1. string 클래스 C에서 char* 또는 char[]의 자료형으로 문자열을 다룬 것과 다르게 문자열을 하나의 변수 타입으로 사용해 문자열을 쉽게 다룰 수 있게 해주는 클래스 char* 또는 char[]과 달리 문자열 끝에 '\0'이 들어가지 않으며, 문자열 길이를 동적으로 변경할 수 있다. 2. string 클래스 생성 방법 |코드|내용| |:-:|:-:| |string str;|빈 문자열 str 생성| |string str = "abc"|"abc"로 선언된 str 생성| |string str2(str1)|str1 string을 복사한 str2 생성| |string *str = new string("abc")|new 이용 동적 할당| 3. string 클래스 연산자 활용 1) 문자열 연결 (+) : 두 문자열을 이어준다. 2) 문자열 비교 (, ==) : 두 문자열의 사전 상 순서를 비교하거나, 동일 여부 파악 가능

2023년 1월 1일
·
0개의 댓글
·