Data Structure(2)

EHminShoov2J·2023년 8월 24일
0

CPP/코딩테스트

목록 보기
8/25
post-thumbnail

1. set()

셋은 고유한 요소만을 저장하는 컨테이너로 map과 같이 자동 정렬된다.

set<자료형>

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int main(){
    cout << "set()" << endl;
    set<pair<string, int>> st;
    st.insert({"this", 1});
    st.insert({"this", 1});
    st.insert({"this", 1});
    st.insert({"next", 1});
    cout << st.size()<< endl;
    for( pair<string,int> a : st) cout << a.first << endl;
    cout << endl;
}

* set 과 unique

둘다 중복을 제거한다는 점에서 비슷하나 set 이 조금더 사용하기 편해 보인다.
하지만 효율성의 관점에서 set으로 변환하는 경우 이후 vector로 사용하기 위해서는 다시 한번더 vector로 변경해주어야하는 문제가 있다. 빈번하게 추가되는 경우 안좋은 선택지일 수 있음!


2. multiset()

중복되는 요소도 집어넣을 수 있는 자료구조. 자동 정렬됨

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int main(){
    cout <<"multiset" << endl;
    multiset<int> mst;
    for( int i = 1; i <= 5; i ++){
        mst.insert(i);
        mst.insert(i);
    }
    for( int a : mst) cout << a;
    cout << endl<<endl;
}

3. stack()

후입선출(Last in First out)의 서잊ㄹ을 가진 자료구조.
삽입, 삭제는 top에서만 가능하며 O(1), 탐색에 O(N)이 걸림.

3.1. pop()

python 과 다르게 pop()의 리턴이 없다. top()으로 값을 확인해야 한다는 점을 기억하자.

3.2. size()

cpp 에서 0은 false 로 취급된다. while 문과 조합해서 사용하기 용이하다.

#include <iostream>
#include <vector>
#include <stack>

int main(){
    cout << "stack" << endl;
    stack<int> my_stack;
    for( int i = 1; i <= 5; i ++){
        my_stack.push(i);
    }
    while(my_stack.size()){ // cpp에서 0이면 거짓!
        cout << my_stack.top(); 
        my_stack.pop(); // 리턴이 안된다. 
    }
    cout << endl <<endl;
}

4. queue()

선입선출 (First in First out)의 구조. stack과 동일한 시간 복잡도를 가지고 있다.

4.1. front()

stack 에서는 top, queue에서는 front이다.

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main(){
    cout << "queue" << endl;
    queue<int> my_queue;
    for( int i = 1; i <= 5; i ++){
        my_queue.push(i);
    }
    while(my_queue.size()){ // cpp에서 0이면 거짓!
        cout << my_queue.front(); // stack은 top// queue 에서는 front
        my_queue.pop(); // 앞에서 부터 나옴! 
    }
    cout << endl;
}

5. deque()

양방향 삽입 삭제가 가능
양방향이므로, push_back, push_front, front, back, pop_back, pop_front 등이 모두 존재!

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main(){
     deque<int> dq;
    for( int i = 1; i <= 5; i ++){
        dq.push_back(i);
        dq.push_front(i);
    }
    for(int a : dq) cout << a;
    cout << endl;

    while(dq.size()){ 
        cout << dq.front(); 
        dq.pop_front(); 
        dq.pop_back(); 
    }
    cout << endl;
}

6. priority_queue

우선 순위가 부여되어 있는 컨테이너를 의미한다.

priority_queue<자료형> pq1;
priority_queue<자료형, 컨테이너, operator> pq2;

이때 우선순위가 반대로 적용된다.(grater<자료형> 의 경우 sort()에서 사용하는 경우 내림 차순이지만, priority_queue에서 사용하는 경우 오름 차순으로 정렬된다. true인 경우 아래 쪽으로 내려가는 로직으로 구성되어 있을 거라고 추측한다.)

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct Point
{
    cout << "priority queue" << endl; // true 이면 아래쪽으로 향하도록 로직이 짜여져 있는듯
    priority_queue<int> pq1; 
    priority_queue<int, vector<int>, greater<int>> pq2; // 여기서는 오름 차순. sort() 에서 cmp로 적용시 내림 차순
    priority_queue<int, vector<int>, less<int>> pq3;

    for(int i = 1; i<= 5; i++){
        pq1.push(i);
        pq2.push(i);
        pq3.push(i);
    }

    while(pq1.size()){
        cout << pq1.top() << " : " << pq2.top() << " : " << pq3.top() << endl;
        pq1.pop(); pq2.pop(); pq3.pop(); 
    }
}

0개의 댓글