No Rules Rules

STL pair (feat. c++, make_pair) 본문

언어/STL

STL pair (feat. c++, make_pair)

개발하는 완두콩 2022. 7. 20. 13:27
728x90
반응형

우리가 사용하는 일반적인 자료형은

char, short, int, float, double 등과 같습니다.

이는 하나의 정보를 하나의 공간에 담는 것을 의미하는데요.

그럼 두개의 정보를 하나의 공간에 담고 싶은 경우는 없을까요?

 

구조체를 사용합니다!

 

일반적으로 두개의 정보를 하나의 공간에 담고 싶을때 구조체를 사용합니다. 아래와 같이 말이죠.

struct SomethingValue
{
	int something1;
	double something2;
}
int main()
{
	SomethingValue something_value;
	something_value.something1 = 5;
	something_value.something2 = 1.2;

	...
}

하지만 여기서 다음과 같이 불편함을 느낍니다.

 

나는 int형 double형이 아니라 short형 int형을 담고 싶은데?

 

아! 그럼 short형과 int형을 담는 구조체도 만들면 되겠구나! 라는 생각이 듭니다.

그래서 원래의 코드를 아래와 같이 변경합니다.

struct SomethingValue1
{
	int something1;
	double something2;
}
struct SomethingValue2
{
	short something1;
	int something2;
}
int main()
{
	SomethingValue1 something_value1;
	something_value1.something1 = 5;
	something_value1.something2 = 1.2;

	SomethingValue2 something_value2;
	something_value2.something1 = 3;
	something_value2.something2 = 4;

	...
}

자! 이제 필요한 모든 공간을 만들었습니다.

기분좋게 개발을 이어나가는 도중 다음과 같은 추가 요구사항이 생깁니다.

 

char형과 float형을 담는 공간도 필요해!

 

난감합니다.

이렇게 계속 필요한 공간이 생길수록 구조체를 만들어야하나?

그래서 생각합니다.

 

사용자가 필요한 자료형을 직접 선언해서 사용하게 하면 어떨까?

 

그래서 다음과 같이 코드를 전면 수정하였습니다.

 

반응형

 

template<typename T1, typename T2>
struct SomethingValue
{
	T1 something1;
	T2 something2;
}
int main()
{
	SomethingValue<int, double> something_value1;
	something_value1.something1 = 5;
	something_value1.something2 = 1.2;

	SomethingValue<short, int> something_value2;
	something_value2.something1 = 3;
	something_value2.something2 = 4;

	SomethingValue<char, float> something_value3;
	something_value3.something1 = 1;
	something_value3.something2 = 1.9f;
	...
}

이제 사용자가 원하는 모든 자료형을 담는 공간을 정의하였습니다. 구조체로 말이죠!

 

그럼 pair는 뭐죠?

 

지금까지의 행위를 STL에서 제공하는 구조체를 통해 해결할 수 있습니다.

바로 pair 입니다.

pair의 원형을 확인하면 아래와 같습니다. (아래는 C++20 기준입니다.)

template <class _Ty1, class _Ty2>
struct pair { // store a pair of values
    using first_type  = _Ty1;
    using second_type = _Ty2;
	
	...

	_Ty1 first; // the first stored value
    _Ty2 second; // the second stored value
};

즉, 사용자가 정의한 _Ty1 자료형 first와 _Ty2 자료형 second을 담는 구조체를 pair 라고 하고

이는 STL에서 제공하는 구조체입니다.

따라서 사용자가 마지막으로 작성한 코드는 다음과 같이 수정할 수 있습니다.

int main()
{
	std::pair<int, double> something_value1;
	something_value1.first= 5;
	something_value1.second = 1.2;

	std::pair<short, int> something_value2;
	something_value2.first = 3;
	something_value2.second  = 4;

	std::pair<char, float> something_value3;
	something_value3.first = 1;
	something_value3.second  = 1.9f;
	...
}

즉 첫번째 자료형에 대한 변수는 first로, 두번째 자료형에 대한 변수는 second로 접근할 수 있습니다.

간단히 말해서 구조체 내에 first라는 변수와 second라는 변수가 존재하는 것이죠.

물론 선언과 동시에 초기화도 가능합니다.

int main()
{
    std::pair<int, double> something_value1{ 5, 1.2 };
    std::pair<short, int> something_value2( 3, 4 );
    std::pair<char, float> something_value3 = std::make_pair<char, float>(1, 1.9f);
}

그런데 이제는 이런 의문이 듭니다.

 

왜 두개의 자료형만 담을 수 있지?

 

다음은 STL tuple 에 대해서 설명하겠습니다.

728x90
반응형
Comments