프로그래밍 공부
작성일
2023. 5. 28. 04:21
작성자
WDmil
728x90

STL에 존재하는 컨테이너중 데이터를 선형적으로 관리하는것 이 아닌, 트리구조로 관리하는 컨테이너를 이야기 한다.

 

종류는 다음과 같다.

  • Set / MultiSet
  • Map / MultiMap

AssociativeContainer는 데이터를 트리구조로 저장하면서, Key / Value 로 관리하게 되는데, Key를 트리구조 로 정리한 뒤 해당되는 Key에 접속하면 Key에 저장된 value의 주소로 타고 들어가는 방식이 된다.


Set

저장하는 데이터 값 자체를 키로 사용하는 컨테이너 이다.

 

그렇기 때문에, 탐색 시 데이터의 존재 유무만 확인하며 탐색하게 된다.

 

또한, Key가 따로 없기 때문에 데이터의 중복을 허용하지 않는다.

 

 

다음은 코드 예시이다.

#include <iostream>
#include <set>

int main() {
    cout << "Set" << endl;

	set<string> strset1;

	strset1.insert("Hello");
	strset1.insert("World");
	strset1.insert("Hello");

	cout << strset1.size() << endl;

	for (const auto& ele : strset1)
		cout << ele << ' ';
	cout << endl << endl;
   }

위에서 트리구조로 데이터를 저장하게 되어 문장의 단어당의 아스키코드를 사용하여 처음 들어간 값을 기준으로 우측에 더 큰 값, 좌측에 더 작은값으로 순환하며 저장되게 된다.


MultiSet

Set과 기본구조는 동일하지만, Value 이외의 Key를 사용하여 순환참조를 하게 된다.

데이터의 존재 유무를 참조하지 않기 떄문에, 중복값을 허용해야하는 경우 사용한다.

 

다음은 코드 예시이다.

#include <iostream>
#include <set>

int main() {
	cout << "Multiset" << endl;

	multiset<string> strset2;

	strset2.insert("Hello");
	strset2.insert("World");
	strset2.insert("Hello");

	cout << strset2.size() << endl;

	for (const auto& ele : strset2)
		cout << ele << ' ';
	cout << endl << endl;
}

위에서 본것과 같이, 데이터가 입력될 때, 입력순서 대로 Key값을 부여받아. Key기준으로 데이터를 입력받는다.

 

그렇기 때문에 중복값 입력이 가능하다.


Map

Map은 Set과 다르게, key와 value로 구분되어 동작하게 된다.

이때, Map은 임의의 key와 value로 선언되어 동작하게 되는데, key를 타고 들어가서 value를 호출하는 방식으로 동작하게 된다.

 

이러한 map은 여러개의 주소를 가지는 key값만을 보유한 하나의 구조체가 존재하고. 그 구조체에서 이진트리형식으로 데이터가 정렬된뒤 원하는 값을 탐색하여 주소를 호출하게 된다.

 

다음은 코드 예시이다.

#include <iostream>
#include <map>

int main() {
	cout << "Map" << endl;

	map<char, int> map;
	map['c'] = 50; // mapping
	map['a'] = 10;
	map['d'] = 40;
	map['b'] = 20;
	
	cout << map['a'] << endl;

	map['a'] = 100;
	cout << map['a'] << endl;

	for (const auto& ele : map)
		cout << ele.first << ' ' << ele.second << ' ';
	// ele의 첫번째 요소,				ele의 두번째 요소
	cout << endl << endl;
}

위와같이 원하는 key와 value를 입력하는 방식으로 데이터가 입력되게 된다.


MultiMap

MultiMap은 MultiSet과 동일하게, 중복값을 허용하는 Map이라고 생각하면 편하다.

만약 key값이 같을 경우, 원하는 key를 호출할 때 가장 최근의 key로 호출하게 된다.

또한, key값을 세어줄 때 그 key가 몃개인지 로 탐색이 가능하다.

 

다음은 코드 예시이다.

#include <iostream>
#include <map>

int main() {
	cout << "Multimap" << endl;

	multimap<char, int> multimap;
	multimap.insert(pair<char, int>('a', 10000));
	multimap.insert(pair<char, int>('b', 100));
	//multimap.insert(pair('b', 100)); // C++ 17이후부터는 이렇게 써도 오류가 안난다.

	multimap.insert(make_pair('a', 1000));

	cout << multimap.count('a') << endl;

	for (const auto& ele : multimap)
		cout << ele.first << ' ' << ele.second << ' ';
	cout << endl << endl;
}

 

728x90

'컴퓨터 용어 정리' 카테고리의 다른 글

Window API  (0) 2023.06.14
STL_AdapterContainer  (0) 2023.05.28
STL_SequnceContainer  (0) 2023.05.28
제네릭 프로그래밍(Generic Programming)  (0) 2023.05.05
C++ 람다식 함수 ( Lambda Function )  (0) 2023.05.05