흔히 쉽게 사용하는 디자인패턴 singleton 패턴과 객체의 복사를 방지하는 noncopyable전략. 이 두가지는 boost에서 이미 손쉽게 사용할 수 있도록 지원하고 있습니다. 우선 boost가 소스가 있어야 하며 링크되어 있어야합니다. linux 기준으로 boost는 apt를 이용하여 쉽게 설치가 가능하며 cmake에서 이를 바로 사용할 수 있도록 지원하고 있습니다. install : sudo apt-get install libboost-all-devcmake : https://gist.github.com/PuppyRush/59ae3c26ee4f68f76c0f5305b3a4526d 그런 후 소스상으로 다음과 같이 구현합니다. 이와같이 구현하면 무난하게 싱글턴을 구현해낼 수 있습니다. thread-..
이번편은 컨테이너의 포인터 타입에 대해 비교타입을 특정하라입니다. set이나 map과 같은 associative container들은 항상 정렬상태를 유지하는 특징을 갖고 있습니다. 이때 정렬상태는 기준이 되는 특정 함수를 통해 비교를 통해 상태를 유지합니다. set의 생성자함수 정의를 보면 알 수 있지만 비교를 위한 함수를 생성자를 선택하지 않으면 내부적으로 less를 함수포인터로 갖게 됩니다. less의 구현 less는 별다른 동작 없이 < 연산만을 하여 그 결과를 반환합니다. 하지만 T가 pointer type인경우는 어떻게 될까요? 결론은 포인터 주소를 비교하게 되게 때문에 원하는 대로 정렬이 되지 않습니다. less를 한다해도 역시 *T 로 비교하지 않는 이상 의미가 없구요 따라서 사용자 정의 ..
c++에서 stl에 있는 associative container들은 객체나 값을 비교하는데 있어 비교를 이용하여 원하는 값을 찾거나 비교합니다. associative container에는 set, map이 존재합니다. 여기서 insert, find, erase등의 멤버함수들은 원하는 값을 찾거나 존재여부를 탐색하는데 앞서 언급한바와 같이 비교를 이용합니다. 이때 비교를 위해서 이번장의 주제이기도 한 equailty와 equlvalence를 이해 할 필요가 있습니다. 사실 설명에 앞서 책에서 내용과 달리 현재 std에서는 연관 컨테이너에서 크게 equality를 사용하지 않는것을 보입니다. 우선 더 깊은 설명 이전에 용어 설명을 하면 다음과 같습니다. equailty = 상등관계 c++에서는 opeator..
책에서 원제목은 Use "the swap trink" to trim excess capacity입니다. 책에서 소개된 swpa전략을 이용하면 실제 컨테이너에서 담겨 있는 객체의 크기(size)보다 Capacity가 크게 잡혀 있는경우 이를 size에 맞게 줄일 수 있는것으로 소개 되어 있습니다. 하지만 책이 쓰일 당시는 C++11이 나오기 이전이있기에 이러한 우회 전략이 소개되었지만 C++11이상부터는 shrink_to_fit 함수를 이용하여 size에 맞게 컨테이너의 크기를 간편하고 효율적으로 줄일 수 있습니다. 다음 URL을 참고하세요. http://www.cplusplus.com/reference/vector/vector/vector/
이번장은 C-style API와 stl의 혼용에 대한 장입니다. 이해하는데 달리 큰 어려운점은 없는 장이구요. stl의 vector와 string은 근본적으로 구조가 c-style array와 layout이 같습니다. 따라서 int*, char*등의 primitive type pointer와 vector, string의 포인터는 서로 사용이 가능합니다. 예를들어 다음과 같은경우입니다. 다음처럼 vc 원소를 &를 통해 pointer를 넘길 수 있습니다. 반대로, 배열 a의 사용방법도 이상이 없습니다. string의 경우에는 특별히 주의가 필요합니다. 왜냐하면 c api는 char array에서 null을 항상 요구합니다. 가령 strlen, strcpy같은 함수들이죠. 항상 char 문자열의 끝은 null..
STL의 사용에 있어 장점으로 다가오는 점 한가지는 c style의 배열과 달리 크기를 동적으로 할당함으로써 생산성을 높일 수 있고 메모리 사용에 있어 안정성을 높일 수 있다는 점 입니다 (물론 배열과 달리 여러가지 멤버함수와 알고리즘을 사용할 수 있는 장점도 있습니다.) 하지만 이러한 편리성을 지나치게 맹신한체 STL의 기본 동작들을 간과 한다면 불필요한 시간, 공간의 낭비를 초래하게됩니다. 이번장은 이러한 문제를 방지하기 위한 장입니다. 제목과 같이 "불필요한 재할당을 방지하기 위해 resever를 사용하자"입니다. STL은 기본적으로 할당된 공간이 가득차면 재할당에 있어 다음 전략을 취하고 있습니다. 1. container의 capacity가 모두 찬 상태에서 새로운 공간이 요구되면( 새로운 원소를..
이번편은 컨테이너의 종류에 따라 효과적으로 원소를 삭제하는 방법들을 소개합니다. 1. 특정 원소(값) 지우기. 하나의 원소를 지우려고 할땐 각 컨테이너마다 다음의 멤버함수를 이용하면 됩니다. Container c (1) contiguous memory container c가 vector, deque, string의 경우에는 멤버함수인 erase를 이용하면 됩니다. 단, erase의 경우 삭제할 위치인 iterator를 매개변수로 받으므로 algorithim의 함수인 remove를 이용하여 다음과 같이 사용합니다. c.erase( remove(c.begin(), c.end(), 1992)); range erase의 경우 erase함수의 두번째 매개변수에 end위치를 넘겨줍니다. 시간복잡도는 Linear o..
이번 주제는 컨테이너의 원소가 비어있는지 여부를 확인하기 위해 size()보다 empty()를 호출하라는 주제입니다. 하지만 결론부터 말씀드리면 c11에 와서는 성능상의 차이가 없게 되었습니다. 다만 코드에서 좀더 표현을 명료하기 위해 비어있는지 여부를 확인한다면 size()보다 empty가 좋을것입니다. (또한 size()==0)은 비교의 과정이 한번 더 들어가므로 이 보단 empty()로 한번에 해결함이 낫긴 할겁니다) 앞서 언급한바와 같이 현재는 size()가 상수시간입니다. http://www.cplusplus.com/reference/list/list/size/ 실제로 stl::list::size함수를 보면 다음과 같이 단순히 멤버변수를 반환하게 되어 있습니다. 하지만 splice를 함수의 헤더..
item3의 주제는 컨테이너의 객체(혹은 값)를 정확하고 낮은 비용으로 복사하기 입니다. STL을 사용하는데 있어 핵심으로 알아야할 사안은 값이 복사된다는 사실입니다. (Copy in, Copy out) 이는 다시말해 컨테이너에 존재하는 객체는 그 자체로 유일할 객체가 된다는 사실입니다. (primitive type은 값 그 자체가 복사 되는점에 있어서 예외) 가령 사용자가 만든 객체 Widget이 있다고 가정합니다. 또 각 객체를 생성해 vector에 push_back한다면 이 때 vector에 들어가는 객체는 복사대입연산이 수행되어 값이 복사되어 들어가게 됩니다. 이러한 개념은 algorithm에서 마찬가지로 작용합니다 sort, reverse, nth_elements와 같은 알고리즘에서 적용될 적에..
item1은 어떠한 상황에서 적절한 STL을 선택할것인가에 대한 주제입니다. 1. 임의의 위치에 삽입할 일이 잦다면( vector::insert() ) 순차 컨테이너를 선택한다. - 연관 컨테이너는 이러한 작업을 할 수 없다. 단, insert와 같은 작업은 많은 비용이 발생하므로 신중해야 한다. (insert가 발생하면 모든 원소들을 이동시켜야한다. ) 2. 컨테이너에서 순서가 중요하지 않다면 hashed 컨테이너를 사용한다. (c11에서는 unordered로 변경 됨) 3. c++표준에 꼭 맞춰야 한다면 hashed 컨테이너와 slit, boost::rope는 사용하지 않는다. 4. 원소의 이동이 잦다면 연관메모리 컨테이너는 피하자. (1번과 배치되는 내용이며 선택에 주의가 필요하다. 상황에 맞게 선..
- Total
- Today
- Yesterday
- cpp
- regex
- 카카오 공채
- Pointer
- 악보
- 이루마
- python
- C language
- 알고리즘
- 여행
- linux
- 피아노
- link
- printf
- 코드잼
- 사천
- compile
- Algorithm
- Codejam
- C++
- 중국여행
- 문자열
- Spring
- 정규표현식
- STL
- 중국
- 드럼
- peram jam
- kernerl
- yiruma
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |