※ std::set 요약
std::set은 std::map과 상당히 비슷한 연관 컨테이너이다. 다른 점이 있다면 value 없이 key만으로 이뤄졌다는 것 정도이다.
std::set은 노드 기반 컨테이너이며 균형 이진 트리로 구현 되므로 균형 이진 트리의 모든 특징을 갖는다.
std::set은 std::map과 마찬가지로 중복된 key를 저장할 수 없으므로, 중복 저장하고 싶다면 std::multiset을 사용해야 한다.
동일 타입 집합이라는 점에서는 std::vector와 같지만 요소가 정렬된 위치에 삽입 된다는 점이 다르다.

※ std::set 특징
- std::set은 std::map과 상당히 비슷하다. 차이점이라면 std::map과 다르게 value 없이 key만 저장한다는 것 정도다.
- std::set의 key는 중복될 수 없다. 중복 저장해야 한다면 std::multiset을 사용한다.
- 데이터 삽입과 동시에 정렬이 일어난다.
- 정렬은 key를 기준으로 정렬되며 기본 정렬 기준은 less(오름차순) 정렬이다.
- 검색 또한 key를 기준으로 검색(이분검색)한다.
- 검색시 균형 이진 트리를 이용한 로그 시간 검색 복잡도를 보장한다.

※ std::set을 사용해야 하는 경우
- 삽입과 동시에 정렬해야 할때
- key가 있는지 없는지 알아야 할때
- 많은 데이터를 보관해야 하고, 동시에 검색이 빨라야 할때
- 많은 데이터가 중복 되어서는 안 되며 빠른 검색으로 존재 여부를 신속하게 알고 싶을때!

 

※ std::map 요약
필자가 std::vector와 함께 많이 사용하는 연관 컨테이너 std::map에 대한 설명이다.
std::map은 key와 value의 쌍을 원소로 저장(pair 객체로 저장)하며, set처럼 원소의 key는 중복될 수 없다.
중복 key를 저장해야 한다면 std::multimap을 사용하여야 한다.
연관 컨테이너는 어떠한 key와 짝을 이루어 자료를 보관하는데, 자료를 넣거나 빼거나 찾을 때는 key를 이용하여야 한다.

※ std::map 특징
- std::map은 레드-블랙 트리(Red-Black Tree) 자료구조이다.
- std::map의 key는 중복될 수 없다. 중복 저장해야 한다면 std::multimap을 사용한다.
- 데이터 삽입과 동시에 정렬이 일어난다.
- 정렬은 key를 기준으로 정렬되며 기본 정렬 기준은 less(오름차순) 정렬이다.
- 검색 또한 key를 기준으로 검색(이분검색)한다.
- std::map의 원소는 std::pair 객체로 저장된다.
- 저장할 자료가 적을때는 메모리 낭비와 검색시 오버헤드가 생겨 대포로 파리 잡는 격이다.

※ std::map을 사용해야 하는 경우
- 삽입과 동시에 정렬해야 할때
- 많은 데이터를 보관해야 하고, 동시에 검색이 빨라야 할때
- 데이터 삽입, 삭제가 적을때


 

※ std::list 요약
std::list는 double linked list(이중 연결 리스트)라는 자료구조를 이용하여 만든 시퀀스 컨테이너다.
템플릿 기반이므로 임의 타입을 요소로 가질 수 있으며, 요소 개수에 따라 동적으로 메모리를 관리한다.
double linked list로 되어 있기에 double linked list의 특징을 거의 그대로 가지고 있으며 linked list 자료구조에 대한 이해가 있어야 알맞는 상황에 알맞게 사용할 수 있다. 필자는 std::list를 거의 사용하지 않는다. 나뻐서 안 사용한다기 보다는 std::vector로도 충분한 상황이 대부분이기 때문이다.

※ std::list 특징

- 고정 길이인 배열에 비해 길이가 가변적이다.
- std::vector와 달리 데이터의 중간 삽입, 중간 삭제 속도가 빠르다.
- 데이터 중간 삽입, 삭제시 요소 개수에 상관없이 동일한 상수시간이 소요된다.(상수 시간 복잡도의 수행 성능 보장)

- list의 순회 속도는 O(n), 즉 요소 개수가 많을 수록 순회 속도는 느리다.

- 각 노드는 앞쪽, 뒤쪽 노드와 연결된 이중 연결 리스트다.(반대는 std::forward_list로써, 단일 연결 리스트다)

- 노드 기반이므로 []나 at()을 지원하지 않는다.

 

※ std::list를 사용해야 하는 경우

- 저장할 데이터의 개수가 가변적일때
- 저장된 요소를 자주 검색하지 않을때
- 중간에 데이터 삽입, 삭제가 자주 발생할때
- 랜덤 엑세스를 자주 안할때

 

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

[C++ STL] std::list 주요 멤버 함수 목록  (0) 2015.11.25

※ std::vector 요약
필자가 std::map과 함께 가장 많이 사용하는 시퀀스 컨테이너 std::vector에 대한 설명이다.
std::vector는 동일 타입의 자료 집합으로써 흔히 배열에 비유를 많이 한다.
또한 템플릿 기반이므로 임의 타입을 요소로 가질 수 있으며, 요소 개수에 따라 동적으로 메모리를 관리한다.
다른 컨테이너들에 비해 구조가 단순하고 사용 방법이 쉬우며 속도도 빠른편이다, 또 실용적이라 활용 빈도가 높다.

※ std::vector의 특징
- 배열을 대체할 수 있다.
- 동일 타입의 자료 집합이며 각 요소는 연속된 위치에 배치된다.
- 연속된 위치에 배치되므로 임의 위치를 빠른 속도로 액세스 할 수 있다.
- 최상위 레벨의 임의 접근 반복자를 제공하므로 STL의 거의 모든 알고리즘 사용 가능하다.
- 삽입, 삭제 속도가 느리다. 중간 삽입, 삭제는 더 느리다.

※ std::vector와 배열
- 배열의 크기는 고정이지만 std::vector는 요소 개수에 따라 자동(동적)으로 늘어난다.
- 배열과 std::vector 모두 사용 방법이 쉽다.
- 배열과 std::vector 모두 데이터를 연속된 위치에 순차적으로 저장한다.
- 연속된 위치에 순차적으로 저장하므로 랜덤 엑세스가 가능하다.
- 속도는 보통 배열이 std::vector보다 빠르다.
 
※ std::vector를 사용해야 하는 경우

- 저장할 데이터의 개수가 가변적일때
- 중간에 데이터 삽입, 삭제가 적거나 없을때
- 저장된 요소를 자주 검색하지 않을때
- 랜덤 엑세스를 자주 할때


 


부스트 라이브러리 예제가 필요할 때, 찾기 쉽게 하려고 그대로 퍼옵니다.


출처 : http://www.boost.org/doc/



Table of Contents

What's Included in This Document
I. The Boost C++ Libraries (BoostBook Subset)
1. Boost.Accumulators
2. Boost.Align
3. Boost.Any
4. Boost.Array
5. Boost.Atomic
6. Boost.Chrono 2.0.4
7. Boost.Circular Buffer
8. Boost.Concept_Check
9. Boost.Container
10. Boost.Date_Time
11. Boost.Foreach
12. Boost.Function
13. Boost.Functional/Hash
14. Boost.Heap
15. Boost.Interprocess
16. Boost.Intrusive
17. Boost.Lambda
18. Boost.Lexical_Cast 1.0
19. Boost.Lockfree
20. Boost.Move
21. Boost.MPI
22. Boost.Program_options
23. Boost.PropertyTree
24. Boost.Proto
25. Boost.Random
26. Boost.Ratio 2.1.0
27. Boost.Ref
28. Boost.Signals
29. Boost.Signals2
30. Boost.StaticAssert
31. Boost String Algorithms Library
32. Thread 4.3.0
33. Boost.TR1
34. Boost.Tribool
35. Boost.TypeErasure
36. Boost.TypeIndex 4.0
37. Boost.Typeof
38. Boost.Units 1.1.0
39. Boost.Unordered
40. Boost.Variant
41. Boost.Xpressive
II. Boost Tools
42. The BoostBook Documentation Format
43. Quickbook 1.6
44. Boost.Jam : 3.1.19
45. Boost.Build V2 User Manual

-------------------------------------------------------------------------------------------------------------------------



Documentation

Much work goes into the documentation for the Boost libraries and tools. The documentation included in the library and tool release is also available here:

Additional information about the testing and release practices, infrastructure and in progress developments is available on our Trac wiki.

Translations

Boost doesn't have the resources to translate the documentation itself, but there is at least one separate group translating the documentation. If you have formed another, tell us on the documentation list and we'll add a link.


'프로그래밍 관련 > 관련 문서' 카테고리의 다른 글

[OpenCV] Reference 및 OpenCV Documentation  (0) 2014.07.07


친구가 임의의 위치와 임의의 크기의 원 안에만 점을 찍고 싶다고 해서 만든 함수 입니다.

함수의 첫 번째 인자는 원의 중심 위치고 두 번째는 반지름, 세 번째는 점의 크기입니다.

랜덤 함수로는 C++11의 random헤더에 있는 random_device와 mt19937_64를 사용 했습니다.

원 안에만 점을 찍는 이유는 포탄이나 탄알이 조준 한 곳에 안 맞고 오차가 있기 때문입니다.

서든어택이나 AVA 등의 FPS 게임 해보신 분들은 잘 아실듯요.

원 그리기는 이 링크에 있습니다.



※함수

void CFigure::DrawRandomPoint2D( const POINT ptPos, const float nRadius, const float ptSize /*= 2.0f*/ ) const
{
	POINT ptPoint;

	//랜덤 함수
	std::random_device rn;			//시드 값
	std::mt19937_64 rnd( rn() );	//random_device를 시드 값으로 하여 초기화

	//랜덤의 범위를 0~360 범위 내에서 지정
	std::uniform_real_distribution<float> nDist( 0.0f, 360.0f );
	float fTempDegree = nDist( rnd );
	
	//반지름의 범위를 0에서 입력받은 값 범위 내에서 지정
	std::uniform_real_distribution<float> fDist( 0.0f, nRadius );
	float fTempRadius = fDist( rnd );

	//랜덤으로 뽑은 각과 반지름으로 점 찍을 위치 계산
	ptPoint.x = _SCAST( long, cos( fTempDegree * DEG2RAD ) * fTempRadius );
	ptPoint.y = _SCAST( long, sin( fTempDegree * DEG2RAD ) * fTempRadius );

	//입력 받은 점 기준으로
	ptPoint.x += ptPos.x;
	ptPoint.y += ptPos.y;

	this->DrawPoint2D( ptPoint, ptSize );
}






동영상 입니다.

하얀색 원은 편의상 그린 원 입니다



이건 원과 원 사이에만 점 찍기 입니다.


C++ 차세대 표준인 C++14( ISO/IEC 14882:2014 )가 14년 08월 18일자로 확정되었다고 하네요.

C++11 이후 3년만에 나온 터라 많은 양이 업데이트되지는 않았고, 주로 버그 수정 및 작은 개선 위주로 업데이트 되었습니다.


C++도 다른 언어에 뒤쳐지지 않게 새로운게 자꾸 나와서 좋기는 한데, 아직 C++11은 커녕 그냥 C++도 잘 못하는 저로써는 공부할게 늘었네요.. ㅋㅋ


- 위키피디아

링크


- GCC C++1y/C++14 지원 정보

링크


- Visual Studio C++11/C++14 지원 정보

링크


올초에 산 C++ 관련 책들인데, 아직 한 권도 제대로 못 봤네요.. =_=

올해 다 읽을 수 있으려나 모르겠네요ㅋㅋ



'사진 > 일상' 카테고리의 다른 글

[700D] 하늘  (0) 2014.09.21
[700D] 2014년 9월 8일 한가위 슈퍼문  (2) 2014.09.17
R7 끌고 운길산역 -> 춘천역 라이딩  (0) 2014.08.04
클래시 오브 클랜  (4) 2014.07.21
[700D] 이사  (4) 2014.02.04
[700D] 설악산 신흥사 청동좌불상  (2) 2014.02.01
[700D] 오리  (2) 2014.01.31




-OpenCV란

OpenCV는 Open Source Computer Vision의 약자로써, 실시간 이미지 프로세싱에 중점을 둔 라이브러리다.

원래 인텔이 개발하였었고 지금은 BSD 라이센스로 배포된다.

처음에 인텔에서 만들어서 인지 인텔 CPU에서 사용할 경우 IPP(Intel Performance Primitive)로 인해 속도의 향상을 볼 수 있다.


지원하는 플랫폼은 Windows와 Linux, Mac OS, iOS, Android를 지원한다.








boost란 C++ 커뮤니티 및 C++ 개발자들이 개발하고 있는 오픈 소스 라이브러리의 집합으로써, C++를 위한 멀티스레딩, 정규표현식, 의사 난수 발생, 선형대수 등을 지원하는 유용한 라이브러리 집합이다. 또한 C++ 표준에 영향을 미치기도 하며, 최신 표준인 C++11에 boost 라이브러리가 몇 가지 표준으로 채택되기도 하였다. boost는 UNIX 및 Windows 등을 포함하여 거의 모든 최신 운영체제에서 작동하며 상업 및 비상업적으로 모두 사용이 가능하다.


boost 다운로드는 http://www.boost.org/ 서 하며, 14. 06. 20일 기준 최신 버전은 1.55.0 버전이다. 1.48 버전도 같은 방법으로 빌드가 가능한 걸로 보아, 앞으로 최신버전이 나와도 비슷한 방법으로 빌드할 수 있을 거 같다.


boost를 다운 받았으면 적당한 곳에 압축을 푼다. 필자의 경우 "D:\boost_1_55_0"에 압축을 풀었다.



압축 푼 폴더를 보면 "bootstrap.bat"이라는 배치파일이 있는 데 이걸 실행시킨다.


bootstrap.bat을 실행시키면 커맨드 창에 아래와 같은 문구가 떴다가 몇 초뒤 사라진다.


커맨드 창이 사라지면 아래와 같이 "b2.exe", "bjam.exe"파일이 생성된다.


빌드는 커맨드 창에서 해야하므로 커맨드 창을 실행 시킨 뒤 boost 라이브러리 폴더가 있는 곳으로 이동한다. 필자는 위에서 "D\boost_1_55_0"에 압축을 풀었으므로 아래와 같이 이동했다.



폴더로 이동했으면 아래와 같이 명령어를 입력한다.

b2 toolset=msvc-12.0 variant=debug,release link=static threading=multi address-model=32 runtime-link=shared


볼드체로 된 항목은 환경에 따라 달라지므로 유의해서 입력해야한다. 


가령 msvc는 비주얼 스튜디오의 버전으로써 12.0은 2013버전을 뜻한다. 참고로 2017은 14.1, 2015는 140.0, 2010은 10.0, 2008은 9.0, 2005는 8.0이라고 입력하면 된다. 또 중요한게 address-model인데, 이 옵션은 컴파일 환경이 x86냐 x64냐에 따라 달라진다. 이는 윈도우 비트와는 상관없이 x86로 컴파일 하냐, x64로 컴파일하냐에 따라 달라진다. 대부분의 사람들은 x86 환경에서 컴파일 하므로 잘 모르겠으면 32로 하면 된다. 나머지는 옵션 중 "debug,release"는 "debug"나 "release"로, "shared"는 "static"으로 바꿀 수 있다.


이전 단계의 명령어를 실행하면 5~30분 정도 시간이 흐른후 아래와 같은 창이 뜬다. 2개의 경로가 나오는데,위의 경로는 헤더 파일들이 있고, 아래 경로에는 *.lib파일들이 있다. 헤더는 처음부터 있었고 라이브러리만 생성된 것이다.


필자는 비주얼 2010과 2013을 사용하므로 각각에 맞는 버전으로 컴파일 해두었다.



+ Recent posts