[C/C++] C++ STL Container [1]


์ปจํ…Œ์ด๋„ˆ(Container)?

C++ STL ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐ™์€ ํƒ€์ž…์˜ ๊ฐ์ฒด๋“ค์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. template์„ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๋„ค๋ฆญํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ •ํ•œ ์ž๋ฃŒํ˜•์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด vector๋Š” ๋งจ ์•ž์— ์‚ฝ์ž…/์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— push_front(), pop_front()๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์‹œํ€€์Šค ์ปจํ…Œ์ด๋„ˆ : ๋ฐ์ดํ„ฐ๊ฐ€ ์„ ํ˜•์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ

1. ๋ฐฐ์—ด (array)

ํ—ค๋”ํŒŒ์ผ <array>, namespace std
template <typename T, std::size_t Num> class array;


ํŠน์ง•

  • ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ ๋‹ด๋Š” ์ปจํ…Œ์ด๋„ˆ.
  • ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— ์›์†Œ์˜ ์ถ”๊ฐ€๋‚˜ ์‚ญ์ œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ฐ’๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
  • ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•œ ์ž„์˜ ์ ‘๊ทผ(Random Access)์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋น ๋ฅด๋‹ค O(1).
  • ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•  ๊ฒฝ์šฐ *(arr1), *(arr1+1) ์ ‘๊ทผ ์•ˆ ๋˜๊ณ , *(arr1.data()), *(arr1.data() + 1) ์ด๋ ‡๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.


์‚ฌ์šฉ

#include<iostream>
#include<array>
using namespace std;

int main()
{
	array<int, 5> arr1 = { 1,2,3,4,5 };
	cout << arr1[2] << endl; // ๊ฒฐ๊ณผ: 3
	
	array<double, 3> arr2;
	cout << arr2[2] << endl; // ๊ฒฐ๊ณผ: ์“ฐ๋ ˆ๊ธฐ ๊ฐ’

	array<int, 6> arr3 = {};
	for (int temp : arr3)
	{
		cout << temp << endl;	// ๊ฒฐ๊ณผ: ๋ชจ๋‘ 0
	}

	array<int, 6> arr4 = {1};
	for (int temp : arr4)
	{
		cout << temp << endl; // ๊ฒฐ๊ณผ: 1, 0, 0, 0, 0, 0
	}

	cout << *(arr1.data()) << *(arr1.data() + 1) << endl; // ๊ฒฐ๊ณผ: 1, 2

	return 0;
}


2. ๋ฒกํ„ฐ(vector)

ํ—ค๋”ํŒŒ์ผ <vector>, namespace std
template <typename T> class vector;


ํŠน์ง•

๋™์  ๋ฐฐ์—ด์ด๋‹ค. ๋ฐฐ์—ด(array)๊ณผ ๋น„์Šทํ•œ๋ฐ, ๊ณ ์ •๋œ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • ๊ณ ์ •๋œ ํฌ๊ธฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์›์†Œ์˜ ์ถ”๊ฐ€๋‚˜ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ฐ’๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

  • ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์‚ฝ์ž…์ด๋‚˜ ์‚ญ์ œ ์œ„์น˜ ๋’ค์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ์นธ์”ฉ ๋’ค๋กœ ๋ฐ€๊ฑฐ๋‚˜ ์•ž์œผ๋กœ ๋‹น๊ฒจ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š๋ฆฌ๋‹ค.

  • ์ฒ˜์Œ/๋ ์‚ฝ์ž…/์‚ญ์ œ ์ฒ˜์Œ์€ ์ค‘๊ฐ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Š๋ฆฌ๋‹ค. ๋์€ ๋ฐ€๊ฑฐ๋‚˜ ๋‹น๊ธฐ์ง€ ์•Š์•„๋„ ๋ผ์„œ ๋น ๋ฅด๋‹ค.

  • ์ž„์˜ ์ ‘๊ทผ(Random Access)์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๋™์ž‘ ์›๋ฆฌ

  1. (์—ฌ์œ ๋ถ„์„ ๋‘๊ณ ) ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  2. ์—ฌ์œ ๋ถ„๊นŒ์ง€ ๊ฝ‰ ์ฐผ์œผ๋ฉด, ๋” ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ์ด์‚ฌํ•œ๋‹ค.


size: ์‹ค์ œ ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜
capacity: ์—ฌ์œ ๋ถ„์„ ํฌํ•จํ•œ ์šฉ๋Ÿ‰ ๊ฐœ์ˆ˜

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v1;

	for (int i = 0; i < 1000; i++)
	{
		v1.push_back(10);
		cout << v1.size() << " " << v1.capacity() << endl;
	}

	return 0;
}

size๋Š” 1๊ฐœ์”ฉ ๋Š˜๊ณ , size๊ฐ€ capacity๋ฅผ ๋„˜๊ฒŒ ๋˜๋ฉด capacity๋Š” 1.5๋ฐฐ ๋Š˜์–ด๋‚œ๋‹ค. (์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜๋„)

resize()๋ฅผ ํ†ตํ•ด size๋ฅผ (capacity๋„ ํ•จ๊ป˜ ์ฆ๊ฐ€), reserve()๋ฅผ ํ†ตํ•ด capacity๋ฅผ ๋ฏธ๋ฆฌ ํฌ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ด์‚ฌ๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v1;

	v1.resize(1000);
	cout << v1.size() << " " << v1.capacity() << endl; // 1000, 1000

	return 0;
}

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋ฏธ size๊ฐ€ 1000์ด๋ผ push_backํ•˜๋ฉด 1001 ๋œ๋‹ค.

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> v1;

	v1.reserve(1000);
	cout << v1.size() << " " << v1.capacity() << endl; // 0, 1000

	return 0;
}

capacity ๋Š˜์–ด๋‚œ ์ƒํƒœ์—์„œ size ์ค„์–ด๋“ค์–ด๋„ capacity๋Š” ์ž๋™์œผ๋กœ ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค. reserve()๋กœ๋„ ์ค„์–ด๋“ค์ง€ ์•Š๋Š”๋‹ค. (swapํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ capacity ๋‚ฎ์ถ”๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ธด ํ•˜๋‹ค.)


์‚ฌ์šฉ

vector v1(10, 1); // ๋ชจ๋“  ๊ฐ’์ด 1์ธ size = 10 ๋ฒกํ„ฐ ์ƒ์„ฑ


3. ๋ฆฌ์ŠคํŠธ(list)

ํ—ค๋”ํŒŒ์ผ <list>, namespace std
template <typename T> class list;

ํŠน์ง•

  • ๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ๋‹ค.
class Node
{
public:
	Node*	_next;
	Node*	_prev;
	int		_data;
};


๋™์ž‘ ์›๋ฆฌ

์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ. ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๋น„์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

  • ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ ์ด์ „ ๋…ธ๋“œ์™€ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋“ค๋งŒ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๋˜๋‹ˆ๊น ๋น ๋ฆ„. ๊ทผ๋ฐ ์‚ฌ์‹ค์ƒ ์ž„์˜ ์ ‘๊ทผ์ด ์•ˆ ๋˜๋ฏ€๋กœ ๊ทธ ์œ„์น˜๋กœ ๊ฐ€๋Š” ๊ฒŒ ๋Š๋ฆผ.

  • ์ฒ˜์Œ/๋ ์‚ฝ์ž…/์‚ญ์ œ ์ค‘๊ฐ„ ์‚ฝ์ž…/์‚ญ์ œ์™€ ๋™์ผ.

  • ์ž„์˜ ์ ‘๊ทผ ์ž„์˜ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์‚ฌ์šฉ

  • ๋ฒกํ„ฐ๋ž‘ ๋‹ค๋ฅด๊ฒŒ ์‚ฝ์ž…/์‚ญ์ œ๊ฐ€ ํšจ์œจ์ ์ด๋‹ค ๋ณด๋‹ˆ ํŠน์ • ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์—†์• ๋Š” remove()๊ฐ€ ์žˆ๋‹ค.
    li.remove(10); // 10 ๋ชจ๋‘ ์ œ๊ฑฐ

Categories:

Updated:

Leave a comment