Information Technology/C++

[C++] 표준 템플릿 라이브러리, 컨테이너 소개

이웃어 2019. 11. 30. 13:20

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)


오늘은 STL(Stand Template Library), 즉 표준 템플릿 라이브러리와 컨테이너에 대해 정리하겠습니다.

우리는 프로그래밍을 공부하면서 많은 기능을 구현하고 사용합니다. 사칙연산을 한다거나, 아니면 최댓값 최솟값을 찾고 때로는 배열의 멤버들을 순서대로 정렬하기도 합니다. 이것들 외에도 프로그램을 만들다 보면 자주 사용해야 하는 기능들이 있는데, 그때마다 이 기능을 일일이 구현하지 않고 바로바로 사용할 수 있게 만든 것이 오늘 설명할 STL입니다. <vector>, <string> 등 그동안 헤더에서 include해서 사용했던 기능들이 모두 STL입니다.

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

int sequence_containers()
{
    deque<int> deq;
    for(int i=0; i<10; i++)
    {
    	deq.push_back(i);
        deq.push_front(i);
    }
    
    for(auto &e : deq)
    	cout << e << " ";
    cout << endl;
}

int main()
{
	sequence_containers();
}

첫 번째로 설명할 STL은 deque입니다. deque는 얼핏보면 vector와 사용이 굉장히 유사한데,

vector와 차이점이라면 push_back 외에 push_front도 사용할 수 있는 점입니다.

push_front를 사용하게되면 배열의 인자를 앞, 뒤 모두에서 추가할 수 있습니다.

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

void associative_containers()
{
	//set
	{
		set<string> str_set;

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

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

		for (auto& e : str_set)
			cout << e << " ";
		cout << endl;
	}
}

int main()
{
	associative_containers();
}

이번에는 set이라는 기능입니다. set은 앞에서 다룬 deque, vector와 달리 순차적으로 데이터를 저장하지 않고, 중복되지 않는 값들만 저장을 합니다.

위의 예제에서 insert를 통해 "Hello"를 2번, "World"를 한 번 str_set에 추가하고 size를 출력하면 3이 아닌 2가 출력되고, str_set의 멤버들을 호출해도 "Hello"와 "World"만 출력됩니다.

void associative_containers()
{
	//multiset
	{
		multiset<string> str_set;

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

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

		for (auto& e : str_set)
			cout << e << " ";
		cout << endl;
	}
}

set과 비슷한 또다른 기능이 있는데 바로 multiset입니다. multiset은 set과 사용하는 방식이 비슷하지만,

set과 다르게 중복되는 값도 저장할 수 있습니다.

때문에 위의 코드를 main함수에서 실행하면 set을 사용한 예제와 달리 "Hello"가 2개, "World"가 1개 총 3개의 문구가 출력되는 걸 확인할 수 있습니다.

#include <map>

    //map : key/value
	{
		std::map<char, int> map;
		map['a'] = 10;
		map['b'] = 20;
		map['c'] = 50;

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

		for (auto& e : map)
			cout << e.first << " " << e.second << " ";
		cout << endl;
	}

이번에는 map이라는 STL 멤버입니다. 

map은 매핑mapping, 그러니까 어떤 값과 다른 값을 연결시켜주는 자료구조라고 생각하면 될 것 같아요

map의 핵심은 바로 key - value의 관계입니다.

key는 value값과 연결되어있어서, 말 그래도 value를 호출하는 키key라는 의미입니다.

더 자세한 설명은 데이터베이스, 자료구조에서 배워야 할 것 같아요. 물론 저도..ㅠ

 

map은 사용하는 방법은 다음과 같습니다.

괄호 안에 key로 사용할 자료형과 value로 사용할 자료형을 차례로 입력해주고, map 컨테이너의 이름을 정합니다.

map의 멤버값을 정할 때에는 괄호 안에 key를 index로 주고(map['a']), 그 key값에 저장할 value값을 입력하면 됩니다(map['a'] = 10;).

그리고 컨테이너에 저장된 값을 변경하고 싶을 땐 값을 줄 때와 같이 key값을 인덱스로 불러서 값을 변경하면 됩니다.

특이한 점이 for문을 보면 map을 출력할 때, first와 second라는 단어를 사용하는 점인데요,

first는 key값을, second는 value값을 호출한다고 생각하면 됩니다. 

 

주의하실 점은, map 컨테이너는 중복되는 key값을 가질 수 없습니다. 'a'라는 키가 있으면 동일한 컨테이너 안에 다른 'a'라는 키가 존재할 수 없다는 말입니다.

map과 비슷하게 multimap이라는 컨테이너도 존재합니다. multimap 컨테이너에는 map과 유사하지만, 중복되는 키를 가질 수 있다는 점이 map과의 차이점입니다.