※ 요약
이전에는 C언어로 두 점 사이의 거리를 구했는데, 같은 예제를 이번엔 C++로 작성해보았다.
사실 매일 하나의 글을 포스팅하기 위해 C언어와 C++을 나눠서 하느라 가끔 억지스러운 면이 없지 않아 있는거 같다.

※ 특징
C++을 이용해 피타고라스 정리를 구현하여 두 점 사이의 거리를 구한다.
좀 더 자세한 설명은 이전 글에 있으니 필요하다면 참고하기 바란다.

큰 틀은 C언어로 작성한 것과 같다. template 클래스와 template 함수로 작성하여 타입에 상관없이 거리를 구할 수 있게 하였다.
이렇게 template으로 만든 이유는, 윈도우 클라이언트 영역은 정수 타입이고, OpenGL이나 DirectX는 보통 실수 타입이기 때문이다.
또 필자는 아직 template 문법에 약하기 때문에 조금씩이나마 연습을 하고자 아래와 같이 작성하였다.


아래 화면은 상기 코드에 대한 디버깅 화면이다.

p1은 실수 타입으로, p2는 정수 타입으로 찍힌걸 보니 마음에 든다.

위 소스코드는 2010 기준으로 만들었다, 2013 이상이라면 GetDistance에서 double형으로 형변환을 안해줘도 에러가 발생하지 않는다.




#include <cmath>

template<typename T>
class CPoint
{
public:
	T x;
	T y;

public:
	CPoint( ) : x(0), y(0) { }
	CPoint( T _x, T _y ) : x(_x), y(_y) { }
};

template<typename T1, typename T2>
double GetDistance( const T1& p1, const T2& p2 )
{
	return std::sqrt( double( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) ) );
}

int main( )
{
	CPoint<double> p1( 432, 189 );
	CPoint<int> p2( 38, 392 );

	double dDistance = GetDistance( p1, p2 );

	return 0;
}


서산 호수공원에 위치한 참치향 입니다. 

가격대비 괜찮은 곳이라 서산에 머무를때면 가끔 들르는 곳입니다.

아래 메뉴는 런치 스페셜 정식 1인이고 가격은 16,000원입니다.

나오는 메뉴로는 회 무침, 튀김, 참치회, 초밥 2p, 무 조림, 갈치 튀김, 알밥이 나오고 후식으로 매실차가 나옵니다 ㅋㅋ

















위치입니다.

호수 공원 기준으로 아래 쪽에 있습니다.


 

※ 요약
피타고라스의 정리를 이용한 두 점 사이의 거리 구하기다.
아래 그림과 같은 직각 삼각형이 있을때, 세 변의 길이는 a^2+b^2=c^2인 관계가 성립한다는 것이 피타고라스 정리다.


위 같은 공식을 아래 그림에 적용해보자.

먼저 빨간점 p1과 p2가 있고, 각각 가상의 수직선과 수평선을 그었다. 

그리고 가상의 노란 빗변을 이어주니 직각 삼각형이 되었다.

이제 a^2+b^2=c^2를 이용하여 두 점 사이의 거리를 구한다는게 느낌이 올 것이다.

(좀더 자세히 쓰려다가 그림 그리기도 귀찮고 수식 입력도 안되서 여기까지 작성함)


※ 특징
C언어를 이용해 피타고라스 정리를 구현하여 두 점 사이의 거리를 구한다.

C언어 소스는 아래와 같다. 임의의 점 p1(432, 189)과 p2(38, 392)의 거리를 측정해보니 443.2212가 나왔다.
헤더는 math.h를 추가해주고 GetDistance 함수와 구조체를 복사하면 어느 프로젝트에서든 두 점의 거리를 구할 수 있다.
C++를 이용하여 아래와 같은 예제를 구현하였으니 관심있으면 한 번 보기 바란다.



#include <stdio.h>
#include <math.h>

typedef struct tagPoint
{
	double x;
	double y;
}_Point;

double GetDistance( const _Point p1, const _Point p2 );

int main( )
{
	_Point p1 = { 432, 189 };
	_Point p2 = { 38, 392 };

	double dDistance = GetDistance( p1, p2 );

	return 0;
}

double GetDistance( const _Point p1, const _Point p2 )
{
	return sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y) );
}


명동 토다이에 갔을때 찍은 사진입니다!!

뷔페인데 아래 2접시만 먹었어요..



주말에 강남역에 있는 스시오에 다녀왔습니다. 11시 30분 쯤에 입장하였는데 사람이 꽤 있더라구요.

스시오 가격은 아래와 같습니다. 저는 주말에 간거라서 주말 런치&디너 가격인 16,900원을 주고 먹었습니다.

맛은.. 평타는 치는 거 같습니다만, 뷔페이다 보니 아무래도 일반 초밥집 보다는 회 크기가 작습니다.

초밥 종류는 연어 초밥, 참치 초밥, 계란 초밥, 새우 초밥, 장어 초밥 등등이 나오고 각 종 롤 종류도 많습니다.

또 사진에는 없는데, 샐러드 바도 있어요 ㅋㅋ, 샐러드 바에는 샐러드랑 피자, 새우 튀김, 우동, 떡볶이, 음료수 등이 있구요!

암튼 다음에 기회되면 또 가봐야겠습니다.











 

※ 로또 프로그램 요약
얼마 전 C++11 문법을 이용한 로또 프로그램을 올렸는데, 그 때 올린건 이전에 만든 C 스타일과의 비교를 위해 class를 이용하지 않았었다. 이번에 만든 건 class를 이용하여 만든 버전이다. 더불어 Sunny Holic님이 언급하신 std::shuffle 방식과 random 방식의 속도 비교도 해보았다.

※ 로또 프로그램 특징
- 이전에 만들었던 것과 다르게 class를 이용하여 제작하였다.
- random 방식과 std::shuffle 방식을 이용하여 번호를 생성하며, 두 방법의 속도를 비교 하였다.

아래는 예제 소스코드다, 소스코드는 첨부해뒀으니 Visual Studio 2013 이상이라면 바로 컴파일해 볼 수 있다.
- header file


main.cpp


아래는 속도를 비교한 것이다, 속도는 random 방식이 빠르지만 구현은 shuffle 방식이 더 간단하다는 장점이 있다.

또 random 방식은 다른 곳에 응용(더 많은 수를 중복 없이 생성하는 곳)해도 빠른 속도를 보장 받을 수 있다는 장점이 있다.



 

※ std::shared_ptr 요약
C++11에 새로 추가된 스마트 포인터인 shared_ptr에 대한 내용이다.

스마트 포인터란, 사용하지 않는 메모리나 사용이 끝난 메모리를 자동으로 해제/관리 해주는 것을 의미하는 것으로써 JavaC#의 가비지 컬렉터와 비교 했을때 성능의 손해는 거의 없으면서 메모리 관리의 이점을 얻을 수 있으므로 편하고도 안전하다.

스마트 포인터는 메모리 누수 관리에 자신이 없는 초보자들이나 복잡하고 거대한 프로젝트를 진행할때 사용하면 적당할 거 같다.

그렇지만 필자는 스마트 포인터를 거의 사용하지 않는다. 아직은 직접 할당, 해제를 해줘야 안심?이 되기 때문이다.


※ std::shared_ptr 특징
- 레퍼런스(참조) 카운팅을 지원한다.
- 명시적인 delete를 해주지 않아도 마지막에 참조하는 곳에서 스코프를 벋어날때 자동으로 해제된다.
- 특별히 어려운 문법을 배우지 않고도 메모리 관리에 큰 편의를 제공받는다.

※ std::shared_ptr을 사용해야 하는 경우

- 메모리 관리에 자신없는 분들이 메모리를 관리해야 할 때

- 거대하고 복잡한 프로젝트를 진행 할 때

- C++11이나 그 이상을 지원하는 컴파일러를 사용 할 때


※ 로또 프로그램 요약
C++11 문법을 이용하여 제작한 간단한 로또 프로그램이다.

전에 C언어로 제작한 로또 프로그램을 C++11 문법으로 리팩토링 하였다.

알고리즘 및 큰 흐름은 거의 같고 문법만 C에서 C++11로 바꿨으니 둘을 비교하면서 보면 좋을 것이다.


※ 로또 프로그램 특징
- C++11에 추가된 새로운 random(Mersenne Twister)을 이용하여 속도가 빠르고 품질이 좋다.

- 중복 판별을 위한 인덱스를 따로 관리하여 요소 개수가 많더라도 중복 판별에 상수 시간 복잡도를 갖을 수 있어 매우 빠르다.

- 표준 문법으로만 작성하여 윈도우, 리눅스 모두 컴파일 가능하다. (단 VS2013(12.0) 이상, gcc 4.8 이상)

 

#include <iostream>	//std::cout
#include <random>		//std::mt19937_64
#include <array>		//std::array
#include <algorithm>	//std::sort
#include <functional>	//std::greater

#define _NUMBER_MAX 6
#define _LOTTTO_MAX 45

int GetNumber( const int nMin, const int nMax );
std::ostream& operator<<( std::ostream& ostr, const std::array<int, _NUMBER_MAX>& arr );

int main( )
{
	//변수 선언
	std::array<int, _NUMBER_MAX> nNumber = { 0, };	//생성된 번호가 담길 배열
	std::array<bool, _LOTTTO_MAX> bIndex = { false, };	//빠른 중복 판단을 위한 배열 

	//번호 생성
	for( unsigned int i=0 ; i<nNumber.size() ; )
	{
		const auto nTempNum = GetNumber( 1, _LOTTTO_MAX );	//랜덤으로 번호 생성

		if( bIndex[nTempNum-1] == false )			//생성된 번호와 인덱스를 비교
		{
			bIndex[nTempNum-1] = true;			//생성된 번호와 인덱스 값 변경
			nNumber[i++] = nTempNum;			//생성된 번호 삽입
		}
	}

	//정렬, 주석을 지우면 내림차순 정렬한다.
	std::sort( nNumber.begin(), nNumber.end()/*, std::greater<int>( )*/ );
	
	//출력
	std::cout<<nNumber;

	return 0;
}

int GetNumber( const int nMin, const int nMax )
{
	std::random_device rn;		//시드 값
	std::mt19937_64 rnd( rn() );	//random_device를 시드 값으로 하여 초기화

	//랜덤의 범위를 지정
	std::uniform_int_distribution<int> nDist( nMin, nMax );
	
	return nDist( rnd );
}

std::ostream& operator<<( std::ostream& ostr, const std::array<int, _NUMBER_MAX>& arr )
{
    for( auto &i : arr )
    {
        ostr<<" "<<i;
    }

    return ostr;
}

 

 

홍대 돈부리에서 먹은 사케동이랑 아부리 사케동입니다.

그 밖에 치킨가라아게도 맛있습니다.




 

※ 요약

std::list의 주요 멤버 함수 목록이다.

C++03과 C++11의 구분을 색으로 했으며, 추후에 추가되는 C++14, C++17에 대해서도 추가하도록 하겠다.
std::list의 각 멤버 함수들의 본격적인 사용법을 알아보기 전에 한 번 훑어보면 도움이 될 것이다.

 

- C++03

- C++11

 분 류

 멤버 함수

 설 명

Iterators

begin

 첫 번째 원소를 가리키는 반복자를 리턴한다.

cbegin

 첫 번째 원소를 가리키는 상수 반복자를 리턴한다.

end

 마지막 원소를 가리키는 반복자를 리턴한다.

cend

 마지막 원소를 가리키는 상수 반복자를 리턴한다.

rbegin

 역 순차열의 첫 번째 원소를 가리키는 반복자를 리턴한다.

crbegin

 역 순차열의 첫 번째 원소를 가리키는 상수 반복자를 리턴한다.

rend

 역 순차열의 마지막 원소를 가리키는 반복자를 리턴한다.

crend

 역 순차열의 마지막 원소를 가리키는 상수 반복자를 리턴한다.

Element access

at

 제공 안 함

operator[]

 제공 안 함

front

 첫 번째 원소의 참조를 리턴한다.

back

 마지막 원소의 참조를 리턴한다.

Capacity

empty

 원소 존재 유무를 체크한다. 아무것도 없으면 true, 있으면 false를 리턴한다.

size

 원소의 개수를 리턴한다.

max_size

 담을 수 있는 원소의 최대 개수를 리턴한다.

resize

 list의 크기를 변경하고 default 값이나 임의 값으로 초기화한다.

capacity

 제공 안 함

reserve

 제공 안 함

shrink_to_fit

 제공 안 함

Modifiers

clear

 list의 모든 원소를 제거한다.

assign

 기존 원소들은 모두 제거 후, 임의 값으로 n개의 원소를 할당한다.

insert

 임의 위치에 임의 값을 삽입한다.

emplace

 원소 삽입시 컨테이너 내부에서 생성 후 임의 위치에 임의 값을 삽입한다.

emplace_hint

 제공 안 함

erase

 임의 위치의 원소나 지정 범위의 원소를 삭제한다.

push_front

 list의 처음에 원소를 추가한다.

emplace_front

 원소 삽입시 컨테이너 내부에서 생성 후 컨테이너의 처음에 원소를 추가한다.

pop_front

 list의 처음 원소를 제거한다.

push_back

 list의 끝에 원소를 추가한다.

emplace_back

 원소 삽입시 컨테이너 내부에서 생성 후 컨테이너의 끝에 원소를 추가한다.

pop_back

 list의 마지막 원소를 제거한다.

swap

 list1.swap( list2 )일때 list1과 list2를 swap한다.

List operations

merge

 list1.merge( list2 )일때 list1에 list2를 정렬하면서 병합한다.

splice

 2개의 list 중 인자로 주어지는 list의 지정된 원소들을 대상 list로 이동시킨다.

remove

 인자로 받은 값으로 받은 값과 같은 값의 원소를 모두 제거한다.

remove_if

 함수객체의 조건을 만족하는 원소를 모두 제거한다.

reverse

 list에 담긴 원소의 순서를 역순으로 바꾼다.

unique

 list에 담긴 원소 중 연속적으로 중복된 값이 배치된 원소를 제거한다.

sort

 list에 담긴 원소를 정렬한다. 예 : list.sort( std::greater<int>() )

Lookup

count

 제공 안 함

find

 제공 안 함

lower_bound

 제공 안 함

upper_bound

 제공 안 함

equal_range

 제공 안 함

Observers

key_comp

 제공 안 함

value_comp

 제공 안 함

hash_function

 제공 안 함

key_eq

 제공 안 함

Allocator

get_allocator

 list의 allocator 객체를 반환한다.



 

 

'STL - Containers > list' 카테고리의 다른 글

[C++ STL] std::list 개요  (0) 2015.11.11

+ Recent posts