C++

[C++] pair, multimap, adjacent_find 구현

다크엔지니어 2022. 2. 20. 19:55
반응형

이번 글에서는 C++ 에서 pair 컨테이너, multimap 컨테이너의 lower_bound, upper_bound 그리고 adjacent_find 에 대해 설명 해 볼 것이며, template 화 하여 함수포인터 및 객체화 방식을 구현해 볼 것이다.

  • pair 의 경우 2가지의 다른 타입 or 같은 타입의 변수를 저장 가능한 컨테이너
  • multimap 의 경우 2가지의 다른 타입 or 같은 타입의 변수를 저장 가능한 컨테이너 이다. pair 의 집합이라고 봐도 된다.
  • adjacent_find 는 중복되는 값을 빠르게 탐색하여 찾아준다.(template 함수 포인터, 객체화 방식이 존재)

 

구현 해볼 내용으로는 아래와 같다.

 

1. lower, upper_bound  구간 검색

2. adjacent_find 사용해서 검색해보기

  • 중복된 곳의 위치를 반복자로 리턴한다.
  • 함수의 3번째 매게변수의 조건에 따라 바뀐다. 기본 디폴트 메개변수는 중복이다.

3. 함수 포인터, 함수객체 사용

  • 디폴트 메개변수
  • 함수 포인터 매게변수
  • 템플릿 함수 매게변수
  • 템플릿 클래스 함수 operator 매게변수
  • 임시 클래스 템플릿 매게변수(함수객체)

 

아래 소스를 통해 확인해 보자.

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

bool(*pFunc_if)(int, int);

template <typename T>
bool func_if(T nVal1, T nVal2)
{
	if (nVal1 == nVal2)
		return true;
	else
		return false;
}

template <typename T>
class CFunc_if //함수객체
{
public:
	bool operator ()(T nVal1, T nVal2)
	{
		if (nVal1 == nVal2)
			return true;
		else
			return false;
	}
};


int main()
{
	multimap<int, int> mmapData;

	mmapData.insert(pair<int, int>(0, 50));
	mmapData.insert(pair<int, int>(0, 50));
	mmapData.insert(pair<int, int>(1, 51));
	mmapData.insert(pair<int, int>(2, 52));

	multimap<int, int>::iterator mmap_begin_itor = mmapData.begin();
	multimap<int, int>::iterator mmap_end_itor = mmapData.end();

	//1. lower, upper_bound 구간 검색
	int nEqual = 0;
	multimap<int, int>::iterator lower_itor = mmapData.lower_bound(nEqual);
	multimap<int, int>::iterator upper_itor = mmapData.upper_bound(nEqual);

	int nCount = 0;
	for (; lower_itor != upper_itor; ++lower_itor)
	{
		nCount++;
	}
	cout << "값 " << nEqual << "의 갯수는" << nCount << "입니다." << endl;


	for (; mmap_begin_itor != mmap_end_itor; ++mmap_begin_itor)
	{
		cout << mmap_begin_itor->second << ", ";
	}


	cout << "///////" << endl;

	//2. adjacent_find 사용해서 검색해보기
	//중복된 곳의 위치를 반복자로 리턴한다.
	//함수의 3번째 매게변수의 조건에 따라 바뀐다. 기본 디폴트 메개변수는 중복이다.
	
	vector<int> vecData;

	vecData.push_back(1);
	vecData.push_back(5);
	vecData.push_back(5);
	vecData.push_back(8);
	vecData.push_back(8);
	vecData.push_back(11);

	vector<int>::iterator vec_begin_itor = vecData.begin();
	vector<int>::iterator vec_end_itor = vecData.end();
	for (; vec_begin_itor != vec_end_itor; ++vec_begin_itor)
	{
		cout << *vec_begin_itor << ", ";
	}

	//3. 함수 포인터, 함수객체 사용
	
	vector<int>::iterator vec_begin_itor2 = vecData.begin();
	vector<int>::iterator vec_end_itor2 = vecData.end();
	vector<int>::iterator vec_itor;

	pFunc_if = func_if<int>;
	CFunc_if<int> Fi;

	//vec_itor = adjacent_find(vec_begin_itor2, vec_end_itor2); //디폴트 메개변수
	//vec_itor = adjacent_find(vec_begin_itor2, vec_end_itor2, pFunc_if); // 함수 포인터 매게변수
	//vec_itor = adjacent_find(vec_begin_itor2, vec_end_itor2, func_if<int>); // 템플릿 함수 매게변수
	//vec_itor = adjacent_find(vec_begin_itor2, vec_end_itor2, Fi);// 템플릿 클래스 함수 operator 매게변수
	vec_itor = adjacent_find(vec_begin_itor2, vec_end_itor2, CFunc_if<int> ()); // 임시 클래스 템플릿 매게변수 // 함수객체


	if (vec_begin_itor2 != vec_end_itor2)
		cout << "중복 되는 원소" << *vec_itor << endl;
	else
		cout << "중복되는 원소 없다." << endl;

	

	

	getchar();

	return 1;
}
반응형