목록2024/04/13 (12)
그냥 게임개발자
set 고유한 요소만 저장하는 컨테이너 또한 set은 중복을 허용하지 않습니다. map처럼 key - value 쌍으로 넣지 않아도 되며, 여러가지 형태로 넣어도 됩니다. 중복된 값은 제거가 되고 map과 같이 자동 정렬이 됩니다.(오름차순) 함수는 map과 같아요. #include #include using namespace std; int main() { set st; st.insert(pair("Santos", 1)); st.insert(pair("Santos", 1)); cout
저번 포스팅에서는 정렬이 되는 컨테이너 map을 사용했다면, 이번에는 정렬이 되지 않은 unorderd_map을 사용할 것입니다. 물론 함수들은 map과 똑같습니다. map과 unordered_map의 차이점은 map unordered_map 정렬 안정렬 균형 이진 검색트리 기반 해시테이블 기반 탐색, 삽입, 삭제 O(logN)이 걸림 탐색, 삽입, 삭제에 평균은 O(1) 최악은 O(N) 이렇습니다. 만약 정렬이 필요하지 않을 때에는 unordered_map을 사용하는 것도 좋지만 최악의 경우는 map보다 느릴 수 있어요. 왠만하면 map을 사용하는 것을 추천합니다. 간단하게 사용해보고 다음으로 넘어가죠 #include #include using namespace std; int main() { unor..
map은 C#에서 Dictionary와 같습니다. 고유한 키를 가지며 그 키를 기반으로 key - value 쌍으로 이루어져 있는 정렬된 연관 컨테이너입니다. 균형 이진 검색트리(레드 - 블랙트리)로 구현이 되어있어서, 삽입, 삭제 수정 탐색 시간 복잡도는 O(logN)의 시간 복잡도를 가지게 됩니다. 고유한 키를 가지기 때문에 하나의 키에 중복된 값이 들어갈 수는 없습니다. 또한 자동으로 오름차순으로 정렬이 되기 때문에 넣은 순서대로 탐색이 아니라 ASCII 순서대로 정렬된 값들을 기반으로 탐색하게 됩니다. 참조할 때는 대괄호 연산자 [ ]로 해당 키를 넣어 직접 참조할 수 있습니다. 예를 들어 위에처럼 "The Invisible Man" : 4, "Helen Keller" : 7 이런식의 string..
배열은 연속된 메모리 공간에 데이터를 저장 연결리스트는 연속되지 않은 메모리 공간에 데이터 저장 배열은 삽입과 삭제에는 O(n)이 걸리고 참조에는 O(1)이 걸립니다. 연결리스튼 삽입과 삭제에는 O(1)이 걸리고 참조에는 O(n)이 걸립니다. 그렇기에 데이터추가나 삭제를 많이 하는 것은 연결 리스트가 좋으며, 그게 아니고 참조를 많이 하는 자료형이 필요하면 배열로 하는 것이 좋습니다. 왜 연결리스트의 삽입삭제가 O(1) O(n)인지에 대한 설명은 따로 포스팅을 해놓았습니다. https://sudoju.tistory.com/218 Linked_List 연결 리스트! 음 연결리스트란 것은 요소들이 서로 인접한 메모리 위치에 저장되지 않는 선형 자료 구조입니다. 한마디로 주변에 서로 없다는 거죠. 랜덤 접근도..
랜덤접근(Random Access) 동일한 시간에 배열과 같은 순차적인 데이터가 있을 때 임의의 인덱스에 해당하는 데이터에 접근할 수 있는 기능 순차적 접근 데이터를 저장된 순서대로 검색하는 기능 Vector나 Array 같은 경우 랜덤 접근이 가능해 n번째 요소에 접근할 때는 O(1)이 걸리며, 연결리스트나 스택 큐는 순차적 접근만 가능해 n번째 요소에 접근할 때 O(n)시간이 걸립니다.
연결 리스트! 음 연결리스트란 것은 요소들이 서로 인접한 메모리 위치에 저장되지 않는 선형 자료 구조입니다. 한마디로 주변에 서로 없다는 거죠. 랜덤 접근도 불가능하고 오로지 순차적으로만 접근이 가능해요. 각 요소들을 접근하려면 next, prev라는 포인터로 연결이 되어있고 중복은 가능합니다. 그렇다면 이렇게 하면 장점이 뭘까요? 이는 공간적인 효율성이 좋습니다. 뭐 예를 들어 배열에서 중간 데이터를 삭제한다면 이런식으로 삭제가 되서 다시 재배치가 되겠죠? 하지만 연결리스트는 다릅니다. 삭제를 하면 그 요소의 next와 prev포인터를 변경만 시켜주면 되죠. 삽입 또한 똑같아요. 2번째에 삽입하려면 이 방식으로 삽입하고 다시 재배치 하겠죠. 연결리스트의 삽입은 네 포인터만 바꿔주면 되요. 그래서 삽입과..
정적배열이에요. 아시죠? int cArr[10]; // c스타일 array stdArr// std스타일 스타일 방식은 거기서 거기다 익숙한거 사용합시다. vector와는 다르게 함수가 없어요. 배열을 코드로 직접 사용해보죠. 직접 손으로 쓴 것과 눈으로 대충 흝어보는것은 완전히 달라요. 공부하기로 마음 먹었으면 손으로 직접 써주세요. #include using namespace std; int arr[3] = { 1, 2, 3 }; int arr2[] = { 1, 2, 3, 4 }; int arr3[10]; int main() { // 1, 2, 3 for (int i = 0; i < 3; ++i) cout
아 이건 C#에서도 해봤어요 C#에서 되었는데 C++이라고 안될게 있나요? 그러겠죠..? vector를 이용해서 2차원 배열을 만드는 방법은 3가지가 있어요. #include #include using namespace std; int main() { vector vec; vector vec2(10, vector(10, 0)); vector vec3[10]; for (int i = 0; i < 10; ++i) { vector tempVec; vec.push_back(temp); } return 0; } 어우어우 이렇게 3가지 방식이 있는데 vector vec; vector안에 vector 어우 vector vec; for (int i = 0; i < 10; ++i) { vector temp; vec.pu..