이번편은 컨테이너의 포인터 타입에 대해 비교타입을 특정하라입니다. 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..
이번 장은 간단하면서도 STL사용에 있어 중요한 장입니다. 제목과같이, 컨테이너의 요소로써 포인터를 사용한다면 컨테이너가 소멸되기전 필수로 각 객체의 메모리를 해제하라입니다. 위의 코드는 단번에 문제가 어디서 발생하는지 알 수 있습니다. 컴파일도 잘되며 실행하는데 런타임에 죽거나 하는 문제가 생기지 않을것입니다. 하지만 메모리의 누수는 심각한 문제로 다가옵니다. 작은 프로그램에서, 요즘같은 성능이 좋은 컴퓨터에서야 얼마나 문제가 발생하겠냐만 컨테이너에 들어가 있던 객체 몇십만개 였다면? 그 객체 자체의 크기가 크다면? 또는 그 객체가 물고 있던 메모리들은? (객체의 소멸자가 호출되어 물고 있던 자원을 해제한다면) 또는 서버와 같이 오랫동안 메모리에 올라가 있어야할 프로그램에서 꾸준히 메모리 누수가 발생한..
이번편의 주제는 원소의 할당 전략입니다. 원소의 대입 혹은 할당전략은 여러가지가 있을 수 있습니다. 1. for문을 이용한 할당 (push_back, 혹은 공간을 할당받은 후 [], 반복자를 통한 할당) 2. algorithm function사용 copy, fill, replace등의 함수가 대표적인 함수들. 3. range member function( or range constructor) 사용. insert, assign함수나 range 생성자를 이용한 방법입니다. 1번의 경우에는 stl에 있어 권장되지 않는 방법입니다.for문으로 인해 함수의 호출횟수가 비효율적으로 증가하며 가독성도 떨어지기 때문입니다. 2번의 경우에는 코드가 간결해지고 가독성도 좋아지긴 하나 실제로는 반복문을 암시적으로 사용하고..
이번 주제는 컨테이너의 원소가 비어있는지 여부를 확인하기 위해 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와 같은 알고리즘에서 적용될 적에..
- Total
- Today
- Yesterday
- linux
- 정규표현식
- python
- 중국여행
- C language
- STL
- Codejam
- Spring
- yiruma
- 피아노
- 사천
- printf
- 이루마
- 중국
- Pointer
- regex
- C++
- compile
- link
- 코드잼
- cpp
- 알고리즘
- peram jam
- 드럼
- Algorithm
- 문자열
- 카카오 공채
- kernerl
- 여행
- 악보
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |