코딩하기 좋은날
C++ STL 기본 컨테이너 구조(스택,큐,사전,우선순위 큐,집합) -1 본문
저는 평범한 대학생이므로 내용중 틀린부분이 있을 수 있습니다. 알려 주시면 확인 후 바로 수정하겠습니다.
-오늘은 C++ STL에서 자주 사용되는 기본적인 5가지 컨테이너 구조에 대해 알아보겠습니다.
- 1.스택(stack)
|
x라는 항목을 스택 맨 위에 삽입 |
|
스택 맨 위에 있는 항목을 삭제 |
|
스택이 비어있는지를 확인 후 true,false 값을 반환 |
|
스택에 들어있는 원소의 개수를 반환 |
|
스택 맨 위에 있는 항목을 리턴 |
#include <iostream>
#include <stack>
using namespace std;
int main(void) {
stack<int> s; //스택 생성
cout<<s.empty()<<endl; //초기 스택은 비어있으므로 1 출력
s.push(4); //4 푸시
s.push(2); //2 푸시
s.push(3); //3 푸시
cout<<s.top()<<endl; //가장위에 있는 값을 반환
s.pop(); //가장 위에 있는 값을 삭제
cout<<s.top()<<endl;
cout<<s.empty()<<endl;
cout<<s.size()<<endl; //스택의 사이즈 반환
return 0;
}
- 2.큐(queue)
-큐는 FIFO(first-in first-out) 선입선출 규칙을 따르는 자료 구조입니다.( 가장 먼저 들어간 것이 가장 먼저 나오는 자료구조)
카드 놀이를 할때 카드를 꺼낼 때는 맨 위에서 꺼내고 카드를 집어넣을 때는 맨 밑부터 넣는 것을 생각 하시면 될 것 같습니다.
(롤에서 게임을 잡을때 큐를 잡는다고 말 하는데 이것 또한 매칭을 돌리는 유저들을 큐에 집어놓고 순서대로 매칭 시켜주는 원리입니다.)
-연산
|
x라는 항목을 큐의 맨 끝에 삽입 |
|
큐의 맨 앞에 있는 항목을 삭제 |
|
큐의 맨 앞에 있는 항목을 리턴 |
|
큐의 맨 뒤에 있는 항목을 리턴 |
|
큐가 비어있는지 검사, 큐에 들어있는 원소의 개수 반환 |
자주 쓰이는 6가지 연산을 알아 보았습니다. 추가적으로 궁금한 연산은 아래의 사이트에서 확인하시면 될 것 같습니다.
http://www.cplusplus.com/reference/queue/queue/?kw=queue
-큐는 양쪽 끝에 대해 작업을 처리해야 하므로 스택보다는 구현이 힘듭니다. 큐의 구현법은 가장 간단하게 배열을 이용하여 한쪽 끝에 원소를 추가하고 pop 할때마다 배열 원소를 앞으로 한칸 씩 모두 당기는 방법입니다. 하지만 이러한 구현은 pop할 때마다 모든 원소를 옮겨야 하므로 시간 낭비가 매우 심합니다. 따라서 큐의 첫번째와 마지막 원소에 대한 인덱스를 따로 관리하며 원형 으로 큐를 사용하는 것이 공간을 재활용할 수 있어 효율적입니다.
+ 원형 큐를 사용할 때는 첫번째 원소와 마지막 원소의 위치가 겹치는 문제가 생길 수 있는데, 연결리스트를 사용하면 이 문제를 해결할 수 있습니다. 이런 이유로 배열보다 연결리스트를 써서 구현하는 것이 더 편한 몇 안되는 자료구조 가운데 하나입니다.
다음은 테스트용 코드입니다.
큐를 사용하기 위해서는 <queue>를 추가해주어야 합니다.
#include <iostream>
#include <queue>
using namespace std;
int main(void) {
queue<int> q; //큐 생성
q.push(4); //4 삽입
q.push(3); //3 삽입
q.push(2); //2 삽입
q.pop(); //큐의 가장 앞에 있는 4를 삭제
cout<<q.front()<<endl; //큐의 가장 앞에 있는 원소 반환
cout<<q.back()<<endl; //큐의 가장 뒤에 있는 원소 반환
cout<<q.empty()<<endl; //큐가 비어있는지 검사
cout<<q.size()<<endl; //큐의 사이즈 반환
return 0;
}
- 3.사전(map)
|
사전에 key값에 맞는 value 값을 삽입 |
|
시작 iterator를 반환 |
|
끝 iterator를 반환 |
|
사전이 비어있는지, 사전의 크기를 반환 |
|
key 값에 맞는 value 값을 삭제 |
|
사전의 모든 원소 삭제 |
|
key 값에 해당하는 iterator를 반환 |
|
key 값에 해당하는 원소 갯수 반환 |
추가적인 연산은 아래의 사이트에서 확인하시면 될 것 같습니다.
http://www.cplusplus.com/reference/map/map/?kw=map
아래는 테스트 코드입니다.
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main(void) {
map<string, int> m; //map 생성
//밑의 3가지 방법 모두 사용가능하다.
m.insert(pair<string, int>("abc", 4));
m.insert(make_pair("ab",5));
m["abcd"] = 6;
m["abcde"] = 8;
cout<<m.size()<<endl;
m.erase("abc"); //abc키값에 해당하는 value 삭제
cout << "abc : " << m.count("abc") << '\n';
cout << "ab : " << m.count("ab")<< '\n';
for(auto it = m.begin(); it!=m.end(); it++) { //iterator를 이용해서 map 순회
cout<<"key: " <<it->first << " value: "<< it->second<<endl;
}
m.clear(); //모든 원소제거
cout<<m.empty()<<endl;
return 0;
}
맵은 iterator 접근시 ->first 와같이 key값에 접근 가능하고 ->second 또는
(*it).first , (*it).second 와같이 접근하면 됩니다.
우선 순위큐와 집합은 2편에서 다루어보도록 하겠습니다.
'C++' 카테고리의 다른 글
C++ STL컨테이너 구조 - list,multimap (0) | 2019.01.14 |
---|---|
C++ Pair 클래스 (0) | 2019.01.13 |
C++ STL 기본 컨테이너 구조(스택,큐,사전,우선순위 큐,집합,벡터) -2 (0) | 2019.01.12 |