일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- softeer
- Programmers
- directx
- 1563
- baekjoon
- Unreal Engine5
- C
- 오블완
- RootMotion
- RVO
- NRVO
- winapi
- TObjectPtr
- 줄 세우기
- Frustum
- IFileDialog
- 티스토리챌린지
- GeeksForGeeks
- UE5
- 프로그래머스
- UnrealEngine5
- algorithm
- 팰린드롬 만들기
- DirectX11
- C++
- 언리얼엔진5
- 백준
- const
- UnrealEngine4
- 2294
- Today
- Total
목록C++ (27)
Game Develop
1. STL의 end()멤버함수는 마지막원소 다음의 주소를 가리키고있다. 해당 주소를 역참조하면 쓰레기값이 들어있으며, 애초에 역참조하려 하면 에러를 띄운다. 마지막 원소를 얻고싶으면 아래와 같이한다. vector v = {0,1,2,3,4,5}; // 예시 컨테이너는 이걸로 계속 사용. int lastElement = *(--v.end()); // end()는 마지막의 다음 주소이기때문에 --연산. 2. erase(iter)를 할 경우, iter를 포함해서 그 이후의 iterator들의 값들은 다 유효하지 않다. (매우중요) 때문에 역참조를 할 경우 에러가 발생하며, iter이전의 값들에 대해서만 역참조가 가능하다. (굳이 하려한다면) erase()의 리턴값은 iterator이며, iter을 삭제한 후..

STL 컨테이너들은 내부적으로 Iterator가 있다. 컨테이너에 있는 원소들을 탐색하기 위한 포인터같은 객체로써, 각각의 컨테이너들은 탐색하는 방식(알고리즘)이 다르기 때문에 Iterator도 여러 종류가 있다. 입력 반복자 (input iterator) : 읽기만 가능, 순방향 이동, 현 위치의 원소를 한 번만 읽을 수 있는 반복자 출력 반복자 (output iterator) : 쓰기만 가능, 순방향 이동, 현 위치의 원소를 한 번만 쓸 수 있는 반복자 순방향 반복자 (forward iterator) : 읽기/쓰기 모두 가능, 순방향 이동(++)이 가능한 재할당될 수 있는 반복자 양방향 반복자 (bidirectional iterator) : 읽기/쓰기 모두 가능, 순/역 방향 이동(--)이 가능한 반..

vector의 멤버함수 capacity는, 현재 메모리의 재할당없이 몇개의 원소를 집어 넣을 수 있느냐를 알려주고, size()는 실제로 원소가 몇개 들어가있는지를 알려준다. capacity이상으로 원소를 집어넣으려 할 경우 내부적으로 메모리의 재할당이 이루어진다. 재할당 크기는 약 1.5배이다. capacity가 늘어난 이후에는 원소를 삭제하더라도 capacity가 줄어들지는 않는다. vector의 원소를 얻으려할 때 []연산자와 at연산자를 사용하는 방법이 있다. []연산자는 범위검사를 하지않고, at연산자는 범위검사를 한다. 이런게 으레 그렇듯, 범위검사를 하는 at보다는 그냥 []이 조금 더 빠르긴 하다.

그냥 map[i] = 1; 이런식으로 []연산자만 이용했었다. 그런데 insert를 사용하면 성능이 약간 더 좋고, 이미 해당 key값이 들어가 있는지 아닌지 판별할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); map visit; visit.insert({ 'a',500 }); visit.insert({ 'b',300 }); pair returnedValue = visit.insert({ 'a',200 }); if (!returnedValue.second) // a라는 키값이 이미 있기에 false를 리턴. { cout

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 string addString(string s) { string result; for (int i = 0; i = 0x20) // 출력가능한 문자열이면 { result = result + s[i]; // 1번 //result += s[i]; // 2번 } } return result; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); string input; string h = "12345678123242324141424214124215..
배열은 선언과 동시에 정의를 해줘야한다. 그래서 보통 아래처럼 정의한다. int arr[30]; int arr[]; // Error. 그리고 선언된 배열은 포인터변수와 다르게 상수이다. 해당 변수에 다른 값을 대입하지 못한다. 값을 대입하려 할 경우 l-value가 아니라며 컴파일에러가 뜬다. 이런점만 빼면 거의 대부분이 유사하긴 하다. 이외에 차이점을 좀 더 나열하자면 아래와 같다. 1. sizeOf를 사용할 때. sizeof(포인터변수) -> 포인터변수의 크기가 리턴된다. 포인터변수의 크기는 32bit컴파일러인지, 64bit컴파일러인지에 따라 다르다. sizeof(배열) -> 배열전체의 총 크기를 변환한다. int arr[3]인 경우, sizeof(int) * 3이 될 것이다. 2. 문자열 문자열을 ..
보통 int형 배열을 선언하고 0으로 초기화하려하면 아래와 같이 코드를 작성한다. 1. int arr[200] = {0}; 2. memset(arr,0,200); 두 방법의 차이는 뭘까? 정답은 거의 동일하다이다. Visual Studio 2017 기준으로, 컴파일러는 두 방법 다 내부적으로 _memset을 호출해서 해당 작업을 수행한다. 0으로 말고, 다른값으로 초기화하고 싶으면 아래와 같은 함수를 사용하자. fill_n (arr,200,-1000); // arr을 -1000으로 초기화. 2차원배열을 초기화하고 싶다면 아래와 같이 사용하면 된다. int arr[200][200]; fill(&arr[0][0], &arr[199][200], -1000) // 2차원배열 arr을 -1000으로 초기화. 보다..