관리 메뉴

Partially Committed

[c++]Associate container λ³Έλ¬Έ

πŸ”₯ Algorithm || λ¬Έμ œν’€μ΄/PS

[c++]Associate container

WonderJay 2022. 6. 25. 23:09
728x90
λ°˜μ‘ν˜•
SMALL

학뢀생이 곡뢀 기둝 μ°¨μ›μ—μ„œ μž‘μ„±ν•œ κΈ€μž…λ‹ˆλ‹€. μ–Έμ œλ‚˜ 지적은 ν™˜μ˜μž…λ‹ˆλ‹€.

 

Associate container

key - value λ₯Ό ν†΅ν•΄μ„œ μ„œλ‘œ κ΄€κ³„μžˆλŠ” 값을 λ¬Άμ–΄ μ €μž₯ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§ν•œλ‹€. key 값을 ν†΅ν•΄μ„œ 각각의 record 에 λΉ λ₯΄κ²Œ 접근이 κ°€λŠ₯ν•˜μ§€λ§Œ specific ν•œ rule 에 μ˜ν•΄ sorting 되기 λ•Œλ¬Έμ— insert ν•  key κ°’μ˜ μœ„μΉ˜λ₯Ό 지정할 수 μ—†λ‹€. balanced binary search tree λ‚˜ hash function 을 μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„λœλ‹€κ³  ν•œλ‹€.

 

std::set

balanced binary tree 둜 κ΅¬ν˜„λ˜μ–΄ μžˆλŠ” μ •λ ¬λœ 집합을 ν¬ν•¨ν•˜λŠ” associate container 이닀. 

μ€‘λ³΅λ˜λŠ” μš”μ†Œλ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€. μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λœ μœ„μΉ˜μ— μ›μ†Œλ₯Ό μ‚½μž…ν•˜κΈ° λ•Œλ¬Έμ— search 속도가 맀우 λΉ¨λΌμ„œ

λ°μ΄ν„°μ˜ 쑴재 유무λ₯Ό νŒŒμ•…ν•˜λŠ” 데에 효율적인 μ»¨ν…Œμ΄λ„ˆμ΄λ‹€. 

void main()
{
	set<int> s;
	s.insert(5);
	s.insert(4);
	s.insert(3);
	s.insert(2);
	s.insert(1); // insert λ₯Ό ν†΅ν•΄μ„œ μžλ™μ μœΌλ‘œ μ •λ ¬λœλ‹€.

	cout << "s 의 size = " << s.size() << '\n';
	
	// set s 의 λͺ¨λ“  μ›μ†Œλ₯Ό 좜λ ₯ν•˜κΈ°
	for (set<int>::iterator iter = s.begin(); iter != s.end(); iter++)
		cout << *iter << ' ';
	cout << '\n';

	// set μ—μ„œ νŠΉμ • μ›μ†Œλ₯Ό μ°ΎκΈ°
	std::set<int>::iterator iter = s.find(3);
	if (iter != s.end())
		cout << "found \n";
	else
		cout << "something wrong \n";

	// νŠΉμ • μ›μ†Œλ₯Ό μ‚­μ œν•˜κΈ°
	s.erase(3);
	for (set<int>::iterator iter = s.begin(); iter != s.end(); iter++)
		cout << *iter << ' ';
	cout << '\n';

	
}

std::multiset

multiset 은 set κ³ΌλŠ” 달리 key λ₯Ό μ€‘λ³΅λ˜κ²Œ μ»¨ν…Œμ΄λ„ˆμ— μ €μž₯ν•  수 μžˆλ‹€. μ™Έμ—λŠ” set κ³Ό λ™μΌν•˜λ‹€. κ·ΈλŸ¬λ―€λ‘œ set 을 μ‚¬μš©ν•˜κ³ μž ν•˜λŠ”λ° key 의 쀑볡이 ν•„μš”ν•œ 상황이라면 multiset 을 ν™œμš©ν•  수 μžˆλ‹€. multiset 은 ν‚€μ˜ 쀑볡이 ν—ˆμš©λ˜κΈ° λ•Œλ¬Έμ— 같은 값을 μ—¬λŸ¬κ°œ μ €μž₯ν•  수 μžˆλ‹€.

 

void main()
{
	multiset<int> s;
	s.insert(5);
	s.insert(4);
	s.insert(3);
	s.insert(2);
	s.insert(1); // insert λ₯Ό ν†΅ν•΄μ„œ μžλ™μ μœΌλ‘œ μ •λ ¬λœλ‹€.

	s.insert(4); // μ€‘λ³΅λœ μš”μ†Œ μ‚½μž…

	cout << "s 의 size = " << s.size() << '\n';
	
	// set s 의 λͺ¨λ“  μ›μ†Œλ₯Ό 좜λ ₯ν•˜κΈ°
	for (set<int>::iterator iter = s.begin(); iter != s.end(); iter++)
		cout << *iter << ' ';
	cout << '\n';

	// set μ—μ„œ νŠΉμ • μ›μ†Œλ₯Ό μ°ΎκΈ°
	std::set<int>::iterator iter = s.find(3);
	if (iter != s.end())
		cout << "found \n";
	else
		cout << "something wrong \n";

	// νŠΉμ • μ›μ†Œλ₯Ό μ‚­μ œν•˜κΈ°
	s.erase(3);
	for (set<int>::iterator iter = s.begin(); iter != s.end(); iter++)
		cout << *iter << ' ';
	cout << '\n';
}

std::map & std::multimap

map 은 key - value λ₯Ό pair 둜 κ°€μ§€λŠ” associate container 이닀. set 은 μ›μ†Œμ˜ κ°’μœΌλ‘œ key ν•˜λ‚˜λ§Œμ„ μ €μž₯ν•  수 μžˆμ§€λ§Œ, map 은 <key , value> 와 같이 pair 둜 μ €μž₯ν•˜λ©° μ€‘λ³΅μœΌλ‘œ μ €μž₯λ˜μ§€ μ•ŠλŠ”λ‹€. κ·ΈλŸ¬λ―€λ‘œ ν•˜λ‚˜μ˜ key μ—λŠ” ν•˜λ‚˜μ˜ value 만 짝지어 μžˆλ‹€. 

void main()
{
	map<string, int> m;

	m.insert(make_pair("first", 1));
	m.insert(pair<string, int>("second", 2));
	m["three"] = 3;

	
	for (map<string, int>::iterator iter = m.begin(); iter != m.end(); iter++)
		cout << iter->first << ' ' << iter->second << '\n';
}

std::multimap 의 κ²½μš°λ„ key 의 쀑볡을 ν—ˆμš©ν•œλ‹€λŠ” 점 μ™Έμ—λŠ” map κ³Ό λ™μΌν•˜λ‹€.

 

unordered associate container

unordered associated conatiner 은 μ •λ ¬λ˜μ§€ μ•Šκ³  λžœλ€ν•˜κ²Œ μ €μž₯되며, hash function 기반으둜 λ™μž‘ν•œλ‹€λŠ” 것이 차이점이닀. 이에따라 μ›μ†Œμ˜ μΆ”κ°€, μ‚­μ œ, 검색 속도가 O(1) 으둜 λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ— ꡉμž₯히 λΉ λ₯΄λ‹€κ³  ν•  수 μžˆλ‹€. 

 


References

1. https://blog.itsforme.dev/stl/

2. https://ya-ya.tistory.com/91#:~:text=1.%20pair%20%ED%81%B4%EB%9E%98%EC%8A%A4,%EB%95%8C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4%20%ED%8E%B8%EB%A6%AC%ED%95%A9%EB%8B%88%EB%8B%A4.

3. https://blankspace-dev.tistory.com/347

4. https://min-zero.tistory.com/79

 

728x90
λ°˜μ‘ν˜•
LIST
Comments