[STL] C++ map, multimap, unordered_map





결과

map 내림차순 결과






코드

#include <iostream>
#include <string>

#include <map>
#include <unordered_map>
using namespace std;

int main() {
	
	// map<int, string> m;	// 오름차순
	map<int, string, greater<int>> m;	// 내림차순
	// multimap<int, string> m;	// 중복 key 가능

	// unordered_map<int, string> m;	// 정렬 x


	m.insert(make_pair(4, "d") );
	m.insert(make_pair(1, "a"));
	m.insert(make_pair(3, "c"));
	m.insert(make_pair(2, "b"));
	m.insert(make_pair(3, "c"));
	
	cout << "개수 : " << m.size() << "\n";
	
	// 3 키를 갖는 원소가 존재하면 해당 값 수정
	if(m.find(3) != m.end() ) m.at(3) = "w";

	m.erase(2);	// key 값

	for (auto i = m.begin(); i != m.end(); i++) {
		cout << i->first << " " << i->second << "\n";
	}
	cout << "\n";


	return 0;
}






1. map


map<int, string> m;	// 오름차순

- <키, 값> 의 구조를 갖는다.

ㄴ 여기서 키는 집합처럼 중복된 key는 갖을 수 없다.



- 해당 키가 이미 존재할 때, 값을 변경하도록 처리하기 위해서는 따로 검사하여 처리해주어야 한다. ( 글 하단에서 설명 )



- 자동으로 오름차순으로 정렬한다.


ㄴ 내림차순으로 정렬하기 위해서는 아래처럼 선언을 해준다.

map<int, string, greater<int>> m;	// 내림차순






2. multimap


multimap<int, string> m;	// 중복 key 가능

- map 라이브러리의 포함되어 있다.


- 기존의 map과는 다르게 동일한 Key를 갖을 수 있다.


- erase() 함수를 사용하여 삭제 시 값을 인수로 준다면 전부 지우지만

하나 씩 지우기 위해서는 find() 함수를 추가적으로 사용하여 삭제하여야 한다.


- at() 함수를 사용하여서 값을 변경할 수 없다.






3. unordered_map


unordered_map<int, string> m;	// 정렬 x

- 기존의 map과 동일하지만 정렬을 하지 않는다.



- 사용하기 위해서는 #include <unordered_map> 해주어야 한다.











insert(make_pair(E key, E value)) : 삽입

- pair을 생성한 후 <키,값> 을 삽입한다.


- 만약 키가 이미 존재할 경우 second의 false를 리턴한다.




erase(E key) 또는 erase(map<E>::iterator) : 삭제

- 키를 넣으면 삭제할 수 있다.


- 혹은 iterator을 인수로 주어서 삭제할 수도 있다.

ㄴ multimap일 경우 중복 값이 가능하므로 

키를 넣어 삭제 시 해당 값이 모두 삭제되지만

find를 사용하여 iterator을 인수로 주면 하나씩 삭제가 가능하다.





find(E e) : 탐색

- 존재하지 않는 값이면 map.end()를 리턴한다.

( end의 iterator )





at(E Key) = "수정할 값" : 수정


- 만약 삽입 시 이미 키가 존재할 경우 값을 변경해 주고 싶다면 해당 예처럼 하면 된다.

if( m.insert(make_pair(3, "w")).second == false ) m.at(3) = "w";

ㄴ 삽입 시 이미 키가 존재하므로 second의 false를 갖는다.

그러면 at() 함수를 사용하여 해당 값을 변경해주면 된다.






[STL] C++ set, multiset, unordered_set





결과

multiset 결과






코드

#include <iostream>
#include <string>

#include <set>
#include <unordered_set>
using namespace std;

int main() {
	
	// set<int> set;	// 오름차순
	// set<int, greater<int>> set;	// 내림차순
	multiset<int> set;	// 중복 집합(중복 가능)

	// unordered_set<int> set;	// 정렬 x


	set.insert(4);
	set.insert(1);
	set.insert(3);
	set.insert(2);
	set.insert(3);

	cout << "개수 : " << set.size() << "\n";

	set.erase(set.find(3));	// 2개의 3 중 하나만 제거

	for (auto i = set.begin(); i != set.end(); i++) {
		cout << *i << " ";
	}
	cout << "\n";


	return 0;
}





1. set


set<int> set;	// 오름차순

- 집합의 구조를 갖는다.

중복 원소 불가능



- 자동으로 오름차순으로 정렬한다.


ㄴ 내림차순으로 정렬하기 위해서는 아래처럼 선언을 해준다.

set<int, greater<int>> set;	// 내림차순






2. multiset


multiset<int> set;	// 중복 집합(중복 가능)

- set 라이브러리의 포함되어 있다.


- 기존의 set과는 다르게 동일한 값의 중복 저장이 가능하다.


- erase() 함수를 사용하여 삭제 시 값을 인수로 준다면 전부 지우지만

하나 씩 지우기 위해서는 find() 함수를 추가적으로 사용하여 삭제하여야 한다.






3. unordered_set


unordered_set<int> set;	// 정렬 x

- 집합의 구조를 갖는다.

 중복 원소 불가능


- 기존의 set와는 다르게 정렬을 하지 않는다. (=삽입한 순서)


- 사용하기 위해서는 #include <unordered_set> 해주어야 한다.










insert(E e) : 삽입

- 값을 삽입한다.





erase(E e) 또는 erase(set<E>::iterator) : 삭제

- 값으로 삭제할 수 있다.


- 혹은 iterator을 인수로 주어서 삭제할 수도 있다.

ㄴ multiset일 경우 중복 값이 가능하므로 

값을 넣어 삭제 시 해당 값이 모두 삭제되지만

find를 사용하여 iterator을 인수로 주면 하나씩 삭제가 가능하다.




find(E e) : 탐색

- 존재하지 않는 값이면 set.end()를 리턴한다.

( end의 iterator )







[STL] C++ deque 덱 생성 및 삽입, 삭제





결과

결과





코드

#include <iostream>
#include <string>
#include <deque>
using namespace std;

int main() {
	deque<int> dq;
	deque<int> dq2 ( 5, 100);

	if (dq.empty()) cout << "덱이 비었습니다.\n";

	dq.push_back(4);	// 4
	dq.push_front(1);	// 1 4
	dq.push_front(3);	// 3 1 4
	dq.insert(dq.begin()+1, 2);	// 3 2 1 4

	cout << "dq1 순 서 : ";
	for (int i = 0; i < dq.size(); i++) {
		cout << dq[i] << " ";
	}

	cout << "\ndq2 순 서 : ";
	for (int i = 0; i < dq2.size(); i++) {
		cout << dq2[i] << " ";
	}
	cout << "\n";

	return 0;
}




Deque(double-ended queue) : 덱 혹은 디큐로 부른다. 구조는 '스택 + 큐' 같은 형태로 앞쪽으로 삽입, 삭제가 가능하면서 뒤쪽으로도 삽입, 삭제가 가능하다.


멤버 함수들은 vector와 거의 유사하다.


링크

[C++/STL] - C++ vector 생성 및 삽입, 삭제





push_back(), pop_back() : 뒤쪽으로 삽입, 삭제




push_front(), pop_front() : 앞쪽으로 삽입, 삭제




insert() : 중간 삽입

- 주로 특정 경우만 사용한다.




empty() : 비어있는지 검사




size() : 길이 리턴





[STL] C++ priority_queue 우선순위 큐





결과

결과 - int 오름차순


결과 - string 내림차순





코드

#include <iostream>
#include <string>
#include <queue>
using namespace std;

int main() {
	// priority_queue<int> q;	// 내림차순 
	// priority_queue<int, vector<int>, less<int> > q;	// 내림차순
	priority_queue<int, vector<int>, greater<int> > q;	// 오름차순

	if (q.empty()) cout << "우선순위 큐가 비었습니다.\n";

	q.push(4);
	q.push(4);
	q.push(2);
	q.push(1);
	q.push(3);

	cout << "맨 위 : " << q.top() << "\n";


	cout << "나가는 순서 : ";
	while (!q.empty()) {
		cout << q.top() << " ";
		q.pop();
	}
	cout << "\n";

	return 0;
}




우선순위 큐(priority_queue) : 스택(stack)과 큐(queue) 같은 자료형.

우선순위 큐는 각 원소들이 우선순위를 갖는다.




내림차순, 오름차순

- priority_queue는 기본적으로 내림차순으로 정렬한다.


- 오름차순으로 정렬하기 위해서는

priority_queue<int, vector<int>, greater<int> > q;	// 오름차순

해야한다.




empty() : 큐가 비었는지 검사




push() : 데이터를 삽입




size() : 길이를 리턴




top() : 가장 우선순위가 높은 원소

- pop() 했을 시 가장 먼저 나간다.




pop() : 데이터를 삭제







[STL] C++ queue 생성 및 삽입, 삭제





결과

결과





코드

#include <string>
#include <iostream>
#include <queue>
using namespace std;

int main() {
	queue<int> q;

	if (q.empty()) cout << "큐가 비었습니다.\n";

	q.push(4);
	q.push(2);
	q.push(1);
	q.push(3);

	cout << "맨 앞 : " << q.front() << "\n";
	cout << "맨 뒤 : " << q.back() << "\n";


	cout << "나가는 순서 : ";
	while (!q.empty()) {
		cout << q.front() << " ";
		q.pop();
	}
	cout << "\n";

	return 0;
}



Queue : 후입후출(or 선입선출)의 구조로 가장 먼저 들어온 것이 가장 먼저 나간다.




empty() : 큐가 비어있는지 검사

- 비어있지 않다면 false를 return 한다.




push() : 데이터를 삽입(push) 




front() : 가장 앞 값을 리턴

- 가장 앞(가장 먼저 나갈) 값을 리턴




back() : 가장 뒤 값을 리턴

- 가장 뒤(가장 나중에 나갈) 값을 리턴




size() : 큐의 길이를 리턴




pop() : front() 값을 삭제(pop)

- 큐는 선입선출의 구조이므로 가장 앞에(가장 먼저 들어온) 값을 삭제한다.


- return 형이 void형이므로 pop()을 해주기 전에 front() 값을 따로 저장해두어야만 이용할 수 있다.


- 큐가 비었을 경우 pop()을 한다면 에러가 발생한다.








pair을 사용하여서 queue 2개 값 저장하기



링크

[C++/STL] - C++ pair 사용하여 쌍으로 값저장




[STL] C++ stack 생성 및 삽입, 삭제





결과

결과





코드

#include <string>
#include <iostream>
#include <stack>
using namespace std;

int main() {
	stack<int> s;

	if (s.empty()) cout << "스택이 비었습니다.\n";

	s.push(4);	// 4
	s.push(3);	// 4 3
	s.push(5);	// 4 3 5
	s.push(1);	// 4 3 5 1
	s.push(6);	// 4 3 5 1 6
	s.push(2);	// 4 3 5 1 6 2
	
	cout << "가장 꼭대기 : " << s.top() << "\n";
	cout << "개수 : " << s.size() << "\n";

	cout << "하나씩 출력 : ";
	while (!s.empty()) {
		cout << s.top() << " ";
		s.pop();
	}
	cout << "\n";

	return 0;
}



Stack : 후입선출(or 선입후출)의 구조로 가장 나중에 들어온 것이 가장 먼저 나간다.

ex) 한줄로만 넣을 수 있는 박스의 물건을 넣는다고 생각하면 된다. 이렇게 된다면 가장 위에 물건을 꺼내야만 그 아래의 있는 물건을 꺼낼 수 있다.




empty() : 스택이 비었는지 검사한다.

- 스택이 비었다면 true를 return 한다.




push() : 데이터를 삽입(push) 한다.




top() : 가장 꼭대기의 값을 리턴한다,

- 가장 꼭대기의 값이므로 pop()했을 때 나오는 값이다.




size() : 스택의 길이를 리턴한다.




pop() : 꼭대기의 값을 삭제(pop) 한다.

- return 형이 void이므로 꼭대기 값을 이용하기 위해서는 pop()하기 전 top()으로 값을 가져와야 한다.


- 스택이 비워져 있을 때 pop()을 실행한다면 오류가 발생한다.







pair을 사용하여서 값 쌍으로 저장하기



링크

[C++/STL] - C++ pair 사용하여 쌍으로 값저장





+ Recent posts