블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2850)
Unity3D (893)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (189)
협업 (64)
3DS Max (3)
Game (12)
Utility (142)
Etc (99)
Link (34)
Portfolio (19)
Subject (90)
iOS,OSX (52)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
제 늦었습니다. 제게는 시간이 없습니다.”  “제가 공부하는 기계입니까? 취미 생활이나 독서를 할 여유도 없이 늘 쫓깁니다.” “전 TV볼 시간은 있어도 책을 읽으려고 한다거나 공부만 하려고 하면 시간이 없다는 생각이 먼저 들어요.” 라고 말하는 시간이 없어 고민하는 이들의 사연을 늘 접합니다.

어른은 어른대로 학생은 학생대로 시간에 쫓겨 친구들과 대화를 나눈다거나 책을 읽는다거나 음악을 듣는 여유가 사치스럽게 보이기까지 한 것이 우리의 현실이기에 하고 싶은 것도 못하고 하지 않아서 뒤떨어진 것도 시간 탓으로 돌려 버리고 맙니다.

그러나 우리에게 시간이라는 것은 있고 없고 하는 것이 아닙니다. 시간은 내가 만들어야 합니다. 모든 이들에게 똑 같은 24시간이 주어졌는데도 어떤 이는 주어진 일 외에 다른 취미생활까지 즐기나 어떤 이는 24시간을 주어진 일에만 매달려도 시간이 부족하다고 불평하는 이도 있지 않습니까. 그렇다면 왜 이런 결과가 나타날까요. 그것은 여러분이 주어진 시간을 잘 활용하지 못한 결과입니다. 돈을 잘 이용해야 살림을 잘 꾸려갈 수 있듯이 시간을 효과적으로 활용할 줄 알아야 우리의 생활을 잘 꾸려갈 수 있습니다.

돈 일 이천원을 길에 그냥 버리는 것은 미친 짓이라고 아까워하면서도 왜 길에다 한 두 시간을 버리는 것은 아까워하지 않습니까? 지금 의미 없이 보내는 그 시간은 여러분의 평생에 두 번 다시 올 수 없는 그런 시간인데도 말입니다. 이제 우리는 오늘 나에게 주어진 시간을 어떻게 활용할 수 있는가 생각해 봅시다. 우선 여러분에게 권하고 싶은 것은 매 시간에 대해서 철저한 계획을 세우라는 것입니다. 시간 계획은 저녁 시간에 내일 할 일을 메모하여 중요한 일부터 우선 순위를 정해서 시간을 분배한 후에 그 시간엔 그 일에만 온전히 정신을 집중해서 일을 처리하고 나서 다른 일로 넘어가는 훈련을 한다면 분명히 좋은 결과가 있을 것입니다.

세계적인 전도자 요한 웨슬러 목사는 5분 간격으로 계획을 세웠다고 합니다. 또 하나는 짧은 시간들을 소중히 여겨야 한다는 것입니다. “티끌 모아 태산”이라는 말을 아실 것입니다. 사람이나 차를 기다리는 시간, 차 안에서의 시간, 수업종이 울리고 선생님께서 오실 때까지의 3~4분, 아침, 저녁 자율학습시간, 그리고 매 수업시간마다 10분씩 주어지는 쉬는 시간 등, 하루 학교생활에서 우리에게 주어지는 3~4분의 자투리 시간들이 특별한 목적이나 의식도 없이 소비되고 있습니다.

아이슈타인 뿐만 아니라 놀라운 업적을 남긴 이들의 공통점 중의 하나가 모두 짧은 시간들을 잘 활용했다는 특징을 갖고 있습니다. 여러분은 지금 다시 시작하기에는 이미 늦었다고 말하면서 망설임과 초조함으로 시간을 보내고 있지는 않습니까? 이제는 미루고 걱정부터 하지 마시고 지금 늦었다고 생각할 때부터 시작하면 결코 늦지 않았음을 명심하세요.

“늦었다고 생각한 때가 가장 빠른 때이다”라고 했습니다. 오늘 여러분의 시간을 어떻게 활용하느냐에 따라 여러분의 미래는 달라집니다. 시간에 대한 긴박감을 가지고 시간을 잘 창조해 나감으로 해서 한 번 주어진 삶을 귀하고 밝게 살아가는 우리가 되어야 하지 않겠습니까?

언제까지 염려만하고 시간이 없다고만 할 것입니까? 여러분이 시작하지 못하고 있는 그 일을 지금 시작하고 싶지 않습니까?

<쪽지도서>, ‘사랑하는 이에게’ 에서 발췌


출처 : http://energybus.tistory.com/56

반응형
Posted by blueasa
, |
타입 이름 바이트 범위
char (/J 옵션에서 0 ~ 255)
signed char
__int8
1 -128 ~ 127
unsigned char
unsigned __int8
0 ~ 255
bool true or false
short
short int
signed short int
__int16
2 -32,768 ~ 32,767
unsigned short
unsigned short int
unsigned __int16
0 ~ 65,535
wchar_t
__wchar_t
0 ~ 65,535
int
signed
signed int
__int32
long
long int
signed long int
4 -2,147,483,648 ~ 2,147,483,647
unsigned int
unsigned
unsigned __int32
unsigned long
unsigned long int
0 ~ 4,294,967,295
float 3.4E +/- 38 (7 digits)
long long
signed long long
__int64
8 - 9,223,372,036,854,775,808 ~
9,223,372,036,854,775,807
unsigned long long
unsigned __int64
0 ~ 18,446,744,073,709,551,615
double
long double
1.7E +/- 308 (15 digits)

타입 이름 설명 비고
__m64 MMX & 3DNow! intrinsics MM[0-7] 레지스터
8바이트 경계 정렬
x64 미지원
__m128
__m128d (SSE2 only)
__m128i (SSE2 only, movdqa)
SSE & SSE2 intrinsics XMM[0-7] 레지스터
16바이트 경계 정렬
IPF 미지원
(movdqa : P3에서 fault 미발생)
__ptr32
__ptr64
32비트에서는 모두 32비트 포인터
64비트에서는 모두 64비트 포인터
/clr:pure 옵션에서 사용 불가
사용 예:
int * __ptr32 p32;


반응형

'Programming > C/C++' 카테고리의 다른 글

다른방식의 싱글톤  (0) 2010.04.15
조건문의 최적화 방법  (0) 2010.04.14
const 키워드 위치에 따른 메소드의 특징  (0) 2010.04.09
String  (0) 2010.03.22
enum 보다 나은 enum  (0) 2010.03.21
Posted by blueasa
, |

CDump& CDump::Func(const char* pt);
CDump& CDump::Func(char* const pt);
const CDump& CDump::Func(char* pt);
CDump& CDump::Func(char* const pt) const;

위치 상으로는 4가지이지만 이게 조합되면 더 많은 경우가 발생하게 된다.

1. CDump& CDump::Func(const char* pt);

이 경우는 Func 메소드에서 pt 포인터 변수에 문자열의 주소를 받고,이때 Func 메소드에서는 pt 포인터 변수가 가리키는 문자열의 공간의 데이터를 상수화 되어 데이터자체를 변경할 수 없다. 하지만 pt 변수는 다른 문자열 주소를 받을 수 있다. pt는 변수를 const한게 아니라 가리키는 곳을 const한 것이므로 데이터만 수정할 수 없다는 것이 특징.

2. CDump& CDump::Func(char* const pt);

이 경우는 Func메소드에서 pt 포인터변수에 문자열의 주소를 받는다.
이때 pt는 주소를 받으면서 변수가 아니라 상수라는 의미이다.달리 말하면 pt라는 변수에 다른 주소를 넣을 수 없지만 pt가 가리키고 있는 데이터공간은 const가 아니므로 데이터를 수정할 수 있다. CDump& CDump::Func(const char* pt); 메소드와의 큰 차이점.

3. const CDump& CDump::Func(char* pt);

이 메소드의 경우는 문자열을 주소를 받아서 처리하는데 Func메소드로 리턴되는 객체에 대해서 const 화 합니다. 이 메소드로 받는 객체는 const이므로 객체내의 변수나 데이터를 수정할 수 없습니다.

4. CDump& CDump::Func(char* const pt) const;

이 메소드는 Func 메소드를 처리하는 동안 자신의 객체를 const화 한다.이 메소드를 처리할 동안 객체의 모든 데이터를 수정할 수 없다는 의미이고.const CDump& CDump::Func(char* pt); 이 메소드와의 차이점은 시점차이이다.const CDump& CDump::Func(char* pt); 이 메소드는 메소드내에서는 자신의 모든 데이터를 수정하거나 가공할 수있지만 리턴 된 객체로 처리할때에는 const되는 것이특징.

하지만  CDump& CDump::Func(char* const pt) const; 이 메소드는 리턴 된 자신의 참조형 객체는 const 하지 않기 때문에 리턴된 객체로 데이터를 수정하거나 가공할 수 있고 즉, 메소드 뒤에 const는 메소드를 처리할 동안에 자신의 객체는 const화 한다는 의미이다.

 

출처 : C++ 프라이머 플러스


반응형

'Programming > C/C++' 카테고리의 다른 글

조건문의 최적화 방법  (0) 2010.04.14
데이터 형의 크기 및 범위  (0) 2010.04.09
String  (0) 2010.03.22
enum 보다 나은 enum  (0) 2010.03.21
클래스 단위로 컴파일러가 생성하는 가상함수 테이블  (0) 2010.03.17
Posted by blueasa
, |
반응형

'Programming > STL' 카테고리의 다른 글

C++ STL int -> string, string -> int 로 변환하기  (1) 2010.04.27
괜찮은 참고 사이트  (0) 2010.04.20
STL  (0) 2010.03.22
STL Container 조합하기  (0) 2010.03.21
About STL : C++ STL 프로그래밍  (0) 2010.03.21
Posted by blueasa
, |
반응형
Posted by blueasa
, |

String

Programming/C/C++ / 2010. 3. 22. 22:05
반응형
Posted by blueasa
, |

STL

Programming/STL / 2010. 3. 22. 22:04
반응형

'Programming > STL' 카테고리의 다른 글

C++ STL int -> string, string -> int 로 변환하기  (1) 2010.04.27
괜찮은 참고 사이트  (0) 2010.04.20
effective_stl-hermet  (0) 2010.04.08
STL Container 조합하기  (0) 2010.03.21
About STL : C++ STL 프로그래밍  (0) 2010.03.21
Posted by blueasa
, |

STL 에서 하나의 Container를 선택하는 방법은 간단합니다.

 

  • vector – 맨 뒤에만 추가할 경우 순차 검색에 유리
  • dequeue – 앞 뒤로 추가할 경우 및 순차 검색에 유리
  • map – 검색이 필요할 경우 유리
  • list – 데이터의 삽입과 삭제가 빈번할 경우 유리

와 같은 식으로 간단하게 선택할 수 있습니다.

하지만가끔가다 보면 위에 Container 의 특징을 하나 이상 만족해야 할 경우가 있습니다특히 검색도 빨라야 하면서초기에 주어진 순서를 그대로 유지해야 하는 경우가 그렇습니다.

간단하게 생각하면 map 와 vector 를 같이 사용하면 되지 않나 싶은데요

몇 가지 고려해야 할 경우가 있습니다.

우선 설명을 더 진행하기 전에 예제에서 사용할 간단한 더미 구조체를 하나 선언하겠습니다단순 설명을 위한 자료구조이니 구조체는 신경 쓰지 말아 주세요. ~


struct DATA

{

           string sKey;

           char szDummy[20];

           int nDummy;

};

 

1.     vector  map 의 조합

먼저 생각할 수 있는 가장 흔한 방법입니다순차 검색을 위해 데이터는 vector 에 보관하고, vector 내의 데이터 인덱스를map으로 관리하는 방법인데요

코드를 나타내면 아래처럼 생각할 수 있습니다.


vector<DATA> m_vtData;

map<string, vector<DATA>::iterator> m_mapVtData;


데이터를 넣어 줘야겠지요아래처럼 vector  DATA 를 넣으면서 map 에는 vector 의 iterator 값을 넣어줘 봤습니다.

bool CstlcontainerDlg::InitData()

{

           DATA data;

           char szBuf[10];

           for (int i = 0 ; i < 1000; i++)

           {

                     sprintf_s(szBuf, sizeof(szBuf), "%03d", i);

                     data.sKey = szBuf;

                     data.nDummy  = i;

                     strcpy_s(data.szDummy, sizeof(data.szDummy), szBuf);

                     m_vtData.push_back(data);

                     vector<DATA>::iterator it = m_vtData.end();

                     it--;

                     m_mapVtData.insert(make_pair(data.sKey, it));

           }

 

           return true;

}

 


이 코드가 잘 작동하는지 아래처럼 검증해 볼 수 있습니다.


void CstlcontainerDlg::OnBnClickedButton2()

{

           // TODO: Add your control notification handler code here

           map<string, vector<DATA>::iterator>::iterator it = m_mapVtData.begin();

           map<string, vector<DATA>::iterator>::iterator itEnd = m_mapVtData.end();

           for (; it != itEnd; it++)

           {

                     TRACE("key Value -> %s\n", it->second->sKey.c_str());

           }

}


잘 작동할까요이미 눈치 채셨겠지만 이 방법은 프로그램이 바로 죽습니다. vector 에서는 iterator 값이 container 의 사이즈가 증가할 때 완전히 달라질 수가 있기 때문에 위 예제와 같이 vector  push_back 을 통해 계속 데이터를 추가하면서 그때 마다 iterator를 저장해서 사용할 경우 아무 의미 없는 데이터를 가리키게 되어 결국 프로그램이 죽게 됩니다.

프로그램을 죽지 않게 하기 위해서는 vector 에 모든 데이터를 넣은 후에, map  iterator 를 넣어주는 방법으로 하면 됩니다.


bool CstlcontainerDlg::InitData()

{

           DATA data;

           char szBuf[10];

           // 우선vector 에아무값이나넣습니다.

           for (int i = 0 ; i < 1000; i++)

           {

                     sprintf_s(szBuf, sizeof(szBuf), "%03d", i);

                     data.sKey = szBuf;

                     data.nDummy  = i;

                     strcpy_s(data.szDummy, sizeof(data.szDummy), szBuf);

                     m_vtData.push_back(data);

           }

          

           // 채워진vector iterator map 에저장합니다.

           vector<DATA>::iterator it = m_vtData.begin();

           vector<DATA>::iterator itEnd = m_vtData.end();

           for (; it != itEnd; ++it)

           {

                     m_mapVtData.insert(make_pair(it->sKey, it));

           }

           return true;

}


만약데이터가 초기에 로딩된 후에 더 이상 삽입이나 삭제가 되지 않을 경우는 이 방법으로 충분합니다하지만 데이터를 더 추가해야 하거나삭제할 경우 모든 map  iterator 를 다시 갱신해야 하는 오버헤더가 따릅니다.


2.     list  map 의 조합

제가 생각하는 가장 좋은 조합입니다.

list  vector 와 달리 모든 iterator 가 삽입삭제에 무관하게 유지 되기 때문에 list::iterator 를 이용하면 훌륭한 데이터 위치 추적이 가능합니다.

이번에는 list  list 의 iterator 를 이용하는 샘플을 만들어 보겠습니다.


list<DATA> m_lstData;

map<string, list<DATA>::iterator> m_mapLstData;


초기 데이터를 넣는 방법은 vector  map 에서와 같습니다아래처럼 짝퉁 키를 만들어서 리스트에 넣고리스트의 iterator를 구해서 map 에 추가했습니다.


bool CstlcontainerDlg::InitData()

{

           DATA data;

           char szBuf[10];

           for (int i = 0 ; i < 1000; i++)

           {

                     sprintf_s(szBuf, sizeof(szBuf), "%03d", i);

                     data.sKey = szBuf;

                     data.nDummy  = i;

                     strcpy_s(data.szDummy, sizeof(data.szDummy), szBuf);

 

                     m_lstData.push_back(data);

                     list<DATA>::iterator itList = m_lstData.end();

                     itList--;

                     m_mapLstData.insert(make_pair(data.sKey, itList));

           }

           return true;

}


이제 map 으로 순차 검색했을 때 list 의 데이터가 제대로 들어 있는지 테스트 코드를 돌려 봤습니다.


void CstlcontainerDlg::OnBnClickedButton3()

{

           // TODO: Add your control notification handler code here

           map<string, list<DATA>::iterator>::iterator it = m_mapLstData.begin();

           map<string, list<DATA>::iterator>::iterator itEnd = m_mapLstData.end();

           for (; it != itEnd; it++)

           {

                     TRACE("key Value -> %s\n", it->second->sKey.c_str());

           }

}


문제 없이 잘 작동합니다 ^^;

이제 리스트에서 키 값이 “887” 인 항목을 지우려고 합니다키 값 검색을 빠르게 하기 위해 당연히 map 으로 검색하고검색된 데이터는 map 과 리스트에서 모두 제거했습니다.


void CstlcontainerDlg::OnBnClickedButton4()

{

           // TODO: Add your control notification handler code here

           string sKey = "887";

           map<string, list<DATA>::iterator>::iterator it = m_mapLstData.find(sKey);

           if (it == m_mapLstData.end())

                     return;

           TRACE("key Value -> %s\n", it->second->sKey.c_str());

           m_lstData.erase(it->second);

           m_mapLstData.erase(it);

 

           it = m_mapLstData.begin();

           map<string, list<DATA>::iterator>::iterator itEnd = m_mapLstData.end();

           for (; it != itEnd; it++)

           {

                     TRACE("key Value -> %s\n", it->second->sKey.c_str());

           }

           TRACE("\nLIST SIZE->%d, MAP<LIST> SIZE -> %d\n"       m_lstData.size(), m_mapLstData.size());

 

}


역시 잘 작동합니다리스트 순차조회의 경우 아시는 것처럼 vector<> 의 순차 검색보다 분명 느린 단점이 있습니다하지만 깨지지 않는 iterator 를 통해 map 과 함께 사용될 경우 안정성을 보장받을 수 있는 장점이 있습니다.

 

3.     기타 조합

그 외에도 데이터를 new 한 다음 그 포인트 값을 vector  map 에 보관시켜 검색과 순차조회를 하는 방법도 물론 있습니다.


vector<DATA*> m_vtData;

map<string, DATA*> m_mapVtData;


이 경우 단점은 new 와 delete 의 책임이 프로그래머가 가지게 된다는 단점이 있고데이터를 삭제해야 할 경우에는 vector의 모든 데이터를 뒤져야 하기 때문에 삭제가 필요한 경우에는 적합하지 않습니다.

 

이상 간단하게 STL 의 컨테이너 선택에 대해 조금 생각해 본 내용인데요또 다른 좋은 방법이 있을지도 모르겠습니다고수님들 혹시 이 글을 읽으신다면 조언 부탁 드리겠습니다. ^^;



반응형

'Programming > STL' 카테고리의 다른 글

C++ STL int -> string, string -> int 로 변환하기  (1) 2010.04.27
괜찮은 참고 사이트  (0) 2010.04.20
effective_stl-hermet  (0) 2010.04.08
STL  (0) 2010.03.22
About STL : C++ STL 프로그래밍  (0) 2010.03.21
Posted by blueasa
, |
반응형

'Programming > STL' 카테고리의 다른 글

C++ STL int -> string, string -> int 로 변환하기  (1) 2010.04.27
괜찮은 참고 사이트  (0) 2010.04.20
effective_stl-hermet  (0) 2010.04.08
STL  (0) 2010.03.22
STL Container 조합하기  (0) 2010.03.21
Posted by blueasa
, |
반응형
Posted by blueasa
, |