[C++ STL] 2.6 그래프(graph)
·
Programming Language(Sub)/C++
그래프(graph)트리는 원형 또는 순환적인 종속성을 표현할 수 없다.하나의 노드에서 다른 노드로 이동하는 경로가 하나만 존재하기 때문에도로망을 생각해보자. 특정 노드에서 다른 노드로 이동하기 위한 다양한 경로가 존재할 수 있다.이러한 경우에는 그래프(graph) 구조를 사용해야 한다그래프 구분 - weight그래프는 노드 데이터뿐만 아니라 노드 사이의 에지 데이터도 저장해야 한다.도로망을 예로 들면 각각의 노드에 다른 어떤 노드들이 연결되어 있는지에 대한 정보를 가지고 있어야 한다.이런 방법으로 필요한 모든 노드와 에지가 있는 그래프를 만들 수 있다.이러한 그래프를 비가중 그래프(unweighted graph)라고 한다.에지에 가중치 또는 더 많은 정보를 부여할 수 있다.도로망에서 에지에 노드와 노드 ..
[C++ STL] 2.5 힙(Heap)
·
Programming Language(Sub)/C++
힙(heap)std::priority_queue에서 다룬 heap에 대해 더 깊이 있게 알아보자힙은 앞서 말했던 것처럼 다음과 같은 시간 복잡도를 만족해야 한다O(1) : 최대 원소에 즉각적으로 접근할 수 있어야 한다.O(log N) : 원소 삽입에 대한 시간 복잡도O(log N) : 최대 원소 삭제에 대한 시간 복잡도원소 삽입 또는 삭제에 대해 O(log N)의 시간 복잡도를 만족하기 위해 트리 구조를 사용해야 한다.특히 이 경우 완전 이진 트리를 사용해야 한다.완전 이진 트리는 트리의 데이터를 배열을 이용하여 저장할 수 있다.루트 노드를 배열 또는 벡터의 맨 처음에 저장하고, 그다음 레벨의 모든 노드는 왼쪽부터 오른쪽 순서로 저장한다포인터를 사용하지 않아서 메모리 사용 측면에서 효율적이다.부모 노드로..
[C++ STL] 1.8 컨테이너 어댑터(Container Adaptor)
·
Programming Language(Sub)/C++
컨테이너 어뎁터(container adaptor)이미 존재하는 컨테이너를 기반으로 만들어진 컨테이너에 대해 알아본다각 자료구조에 대한 기본적인 내용은 이미 알고있다고 가정하고 글을 작성합니다!래퍼를 제공하는 이유코드에 의미를 부여의도하지 않는 함수를 실수로 사용하지 못하도록 제한특별한 인터페이스를 새롭게 제공std::stackLIFO 구조를 사용하기 때문에 스택은 컨테이너의 한쪽 끝에서만 데이터를 삽입/삭제한다벡터나 덱은 이러한 기능을 기본적으로 지원하기 때문에 스택을 구현하기 위한 용도로 사용할 수 있다push_front()로 맨 앞 원소에 접근할 수 있기 때문에 벡터나 덱을 직접 사용하기에는 문제가 있다이와 달리 std::stack을 사용하여 작성된 소스 코드는 어떤 작업을 하고 있는지 직관적으로 알..
[C++ STL] 1.7 std::dequeue
·
Programming Language(Sub)/C++
std::deque배열 기반 컨테이너와 리스트 기반 컨테이너 두 가지 방식이 섞여있는 형태각각의 장점을 적당히 가지고 있다vector에서 push_front(), pop_front() 에서 비용이 많이 드는 단점을 극복할 수 있다deque : 양방향 큐(double-ended-queue)의 약자덱의 구조C++ 표준은 덱의 동작에 있어 다음 조건을 만족해야 한다고 규정한다.push_front(), pop_front(), push_back(), pop_back() 동작이 O(1) 시간 복잡도로 동작해야 함모든 원소에 대해 임의 접근 동작이 O(1) 시간 복잡도로 동작해야 함덱 중간에서 원소 삽입 또는 삭제는 O(n) 시간 복잡도로 동작해야 하며, 실제로는 최대 n / 2 단계로 동작하며 여기서 n은 덱의 크..
[C++ STL] 1.6 std::list
·
Programming Language(Sub)/C++
std::list복습std::forward_list는 기본적인 형태로 구현된 연결 리스트임리스트 끝에 원소 추가, 역방향 이동, 리스트 크기 반환 등의 기능을 제공하지 않음빠른 원소 삽입이 필요한 모든 경우에 어울리는 container는 아니다.std::forward의 단점을 보완하기 위해 c++에서 std::list를 제공한다std::list양쪽 방향으로 연결된 리스트, 즉 이중 연결 리스트(doubly-linked-list) 구조로 되어 있다.따라서 더 많은 기능을 제공한다. (메모리는 조금 더 많이 사용한다)// 이중 연결 리스트 노드 기본 형태struct doubly_linked_list_node{ int data; doubly_linked_list_node* next; doubl..
[C++ STL] 1.5 Iterator(반복자)
·
Programming Language(Sub)/C++
Iterator(반복자)반복자는 포인터와 비슷하지만, STL container에 대한 공통의 interface를 제공한다.반복자를 이용한 연산은 어떤 컨테이너에서 정의된 반복자인지에 따라 결정된다.배열과 벡터의 경우 연속된 자료 구조를 사용하기 때문에 지정 위치의 원소에 바로 접근할 수 있다.이러한 반복자를 임의 접근 반복자(random access iterator)라고 한다.std::foward_list의 경우 역방향 이동을 제공하지 않으며, 이전 노드로 이동하려면 처음부터 다시 찾아가야 한다.증가 연산만 가능하며, 이러한 반복자를 순방향 반복자(foward iterator) 라고 한다.반복자 타입에 따라 사용할 수 있는 함수advance()반복자와 거리 값을 인자로 받고, 반복자를 거리 값 만큼 증가..
[C++ STL] 1.4 std::forward_list
·
Programming Language(Sub)/C++
std::forward_liststd::array, std::vector와 같은 연속된 자료구조는 데이터 중간에 자료를 추가, 삭제하는 작업이 매우 비효율적임따라서 연결 리스트 기반 컨테이너가 등장함연결 리스트를 구성하는 중에 포인터와 관련된 버그 양산을 막기 위해 연결 리스트 wrapper class인 std::forward_list 클래스를 제공함std::forward_list의 기본적인 기능연결 리스트의 성능을 유지하면서 기본적인 기능을 제공함성능 유지를 위해 전체 리스트 크기를 반환하거나, 첫 번째 원소를 제외한 나머지 원소에 직접 접근하는 기능을 제공하지 않음front() 함수는 제공하지만, 거꾸로 움직이는 back() 함수는 제공하지 않음원소의 삽입, 삭제, 순서 뒤집기, 분할을 위한 기능은 ..
[C++ STL] 1.3 std::vector
·
Programming Language(Sub)/C++
std::vectorstd::array의 단점std::array의 크기는 컴파일 시간에 결정되는 상수이어야 한다.런타임 중에 변경할 수 없다.크기가 고정되어 있어서 원소를 추가/삭제할 수 없다.항상 스택 메모리를 사용한다. 메모리 할당 방법을 바꿀 수 없다따라서 가변 크기의 데이터를 처리할 수 있는 컨테이너가 필요하다 --> std::vectorstd::vector - 가변 크기 배열배열 기반으로 구현되어 있다초기화 과정에서 데이터의 크기를 제공하지 않아도 된다std:array의 '고정 크기' 문제를 해결한다벡터를 초기화 하는 몇 가지 방법// 크기가 0인 벡터 선언std::vector vec;// 지정한 초깃값으로 이루어진 크기가 5인 벡터 선언std::vector vec = { 1, 2, 3, 4, ..
[C++ STL] 1.2 std::array
·
Programming Language(Sub)/C++
보호되어 있는 글입니다.
[C++ 자료구조] 1.1 연속된 자료 구조와 연결된 자료 구조
·
Programming Language(Sub)/C++
보호되어 있는 글입니다.