목록C++ 나만의 복습 (43)
그냥 게임개발자
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bs2Lye/btsGqg20VY8/Zx67Soz3qqRtFhOy2oVR3k/img.png)
memcpy()와 똑같은 동작을 하는 함수이며 vector와 Array 모두 쓸 수 있다. copy (InputIterator first, InputIterator last, OutputIterator result) 만약 vector v를 ret에다가 옮기려면 vec : 복사당하는 vector / ret : 복사하는 vector copy(vec.begin(), vec.end(), ret.begin()); #include #include using namespace std; int main() { vector vec {1, 2, 3}; vector ret(3); copy(vec.begin(), vec.end(), ret.begin()); cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cPRyHy/btsGsUqmcg6/bbDBFyJRfelxAesjL41i81/img.png)
깊은복사 얕은복사 들어봤을 거다. 깊은 복사(Deep Copy)는 새로운 공간을 확보해 아예 복사해버려서 새로운 것이 생겨서 값을 바꿔도 원본은 변하지 않음 얕은 복사(Shallow Copy)는 메모리 주소값만 복사해서 값을 변경하면 원본 값도 변경이되는 것 memcpy() memcpy()는 어떤 변수의 메모리에 있는 값들을 다른 변수의 "특정 메모리값"으로 복사할 때 사용 Array을 깊은 복사할 때 쓰인다. 문법은 아래와 같다. void* memcpy(void* destination, const void* source, size_t num); #include #include using namespace std; int main() { int v[3] = {1, 2, 3}; int ret[3]; mem..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/xZLFo/btsGssgtEdw/LZQZvym6D8k6i4zkDjyUx0/img.png)
int a[5] = {0, }; 이런 코드 본적있나? 난 없어 근데 이거 자주쓰인대요 그렇대 아무튼 이 코드 또한 0으로 초기화한다는 의미인데 문법은 아래와 같다. T myarray[N] = {0, }; 하지만 이렇게 초기화 하는 것은 초반에 한번하는 정적 초기화로써만 유효하지 동적초기화로써는 동작하지 않는다. #include using namespace std; int main() { int a[5] = {0, }; for (int i = 0; i < 5; ++i) a[i] = i; a[5] = {0, }; for (int i : a) cout
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ciCc0g/btsGrQopa2d/wt9k383nXMufKBcK3CD9S1/img.png)
저번 포스팅에서 memset()은 0, -1로 초기화 한다고 했다. 기억 나는가? 기억하자 memset() memset()은 바이트단위로 초기화를 한다. 0, -1, char형의 하나의 문자(a, b, c, d 등)으로 초기화 할때만 사용 void* memset(void* ptr, int value, size_t num); memset(배열의 이름, k, 배열의 크기) 이렇게 사용한다. #include #include using namespace std; const int MAX_N = 1004; int a[MAX_N]; int a2[MAX_N][MAX_N]; int main() { memset(a, -1, sizeof(a)); memset(a2, 0, sizeof(a2)); for (int i = 0;..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dXkUPB/btsGqMAbME9/lrmB3HpghqkVmOIqZiNfn1/img.png)
fill() 모든 값으로 초기화 할 수 있는 함수다. 0, 1, 100 등 모든 숫자로 초기화가 가능하다. memset() -1, 0으로만 초기화 가능 memset()을 쓰다보면 0, -1 이외의 값으로 초기화하다 틀리는 경우가 있다. 이 때 fill()을 추천한다. 여기서 보면 memset()은 0과 -1로만 초기화 가능하다보니 fill보다 시간적으로 더 빠르고 최적화 할 수 있다. fill() O(n)의 시간 복잡도를 가진다 fill(시작값 - first, 끝값, -last, 초기화하는 값 - val) 이런식으로 값을 초기화한다. 모든 값을 기반으로 초기화가 가능하며 [first, last]까지 val로 초기화한다. fill()로 배열의 모든 값이 아닌 일부값을 초기화하는 경우도 있지만 보통은 전체를..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/uErFu/btsGqPcBtJy/mtGBp0eIVYzVLXINc8hstK/img.png)
일반화(Generalization)는 여러 사례들의 공통되는 속성들을 일반적인 개념으로 추상화한 형태를 말한다. 이터레이터는 컨테이너의 구조나 컨테이너 안에 들어가 있는 요소의 타입과는 상관없이 컨테이너에 저장된 데이터를 순회하는 과정을 담당하는 아이이다. 그니까 그거다 내가보기엔 이거다. ㅇㅇ 그냥 저 이터레이터는 반복해 밖에 못하는 아이다. 한마디로 각각의 다른 요소들을 쉽게 탐색할 수 있게 한 일반화 장치이다.
이터레이터는 어떠한 컨테이너(배열, 맵, 벡터 등)의 범위 안에서 일부 요소를 가리킨다. 또한 해당 요소들을 순회할 수 있는 개체이다. 이터레이터는 컨테이너의 개체를 참조하는 것이기 때문에 이 자체를 제거할 수는 없다. 반면 다르게 포인터는 변수의 메모리 주소를 저장하는 개체의 개념이며 포인터는 delete를 통해 포인터를 제거할 수 있다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/7dLXt/btsGqMGWv2v/Mp1nYXIgalTd5YK5qoft6k/img.png)
이터레이터는 컨테이너에 저장되어 있는 요소의 주소를 가리키는 개체를 말한다. 그냥 그거다 주소를 가리킨다라고생각하자. 그게 편해나는 그리고 컨테이너는 담을 수 있는 공간이라고 생각하는게 편해요 그게 편해 나는 그래서 담을 수 있는 공간을 생각해보자. vector, map 이런게 있다. 각각 다르게 구현된컨테이너들을 일반화된 이터레이터를 통해 쉽게 순회할 수 있다. 여러가지 방법이 있다. 배열을 보자. ㅇㅇㅇ 그렇다면 리스트는? ㅇㅇ 그러면 스택은? ㅇㅇㅇㅇ 여기서 이런 각각의 컨테이너의 한 주소를 가리키는 개체가 바로 이터레이터이다. 오우씨 나 그림 잘그리네 아무튼 이터레이터는 주소를 가리키는 개체인데 다만 주소값을 바로 반환하지는 못해서 &*를 통해 한단계 더 거쳐서 가리키는 해당 요소의 주소값을 반환..