셋은 고유한 요소만을 저장하는 컨테이너로 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 이 조금더 사용하기 편해 보인다.
하지만 효율성의 관점에서 set으로 변환하는 경우 이후 vector로 사용하기 위해서는 다시 한번더 vector로 변경해주어야하는 문제가 있다. 빈번하게 추가되는 경우 안좋은 선택지일 수 있음!
중복되는 요소도 집어넣을 수 있는 자료구조. 자동 정렬됨
#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;
}
후입선출(Last in First out)의 서잊ㄹ을 가진 자료구조.
삽입, 삭제는 top에서만 가능하며 O(1), 탐색에 O(N)이 걸림.
python 과 다르게 pop()의 리턴이 없다. top()으로 값을 확인해야 한다는 점을 기억하자.
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;
}
선입선출 (First in First out)의 구조. stack과 동일한 시간 복잡도를 가지고 있다.
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;
}
양방향 삽입 삭제가 가능
양방향이므로, 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;
}
우선 순위가 부여되어 있는 컨테이너를 의미한다.
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();
}
}