smarter pointer의 일종인 auto_ptr의 특징과 stl의 주요 특징인 '모든 원소의 접근은 값의 복사가 기본이다'를 상기한다면 이 챕터의 이야기는 매우 간단해집니다. auto_ptr은 최초에 할당이 이루어지고 대입이 이루어질 때 마다 권한이 위임되어 원래의 포인터는 null이 됩니다. 문제는 stl의 기본 동작은 다음을 전제한다는 점입니다. '모든 원소의 대입은 값 복사가 기본이다' 다시말해 operator[], =,at같은 원소들은 컨테이너의 원소가 복사되지 포인터나 레퍼런스를 반환하지 않습니다. 따라서 stl에서의 auto_ptr의 사용은 다음과 같은 문제를 야기합니다. . Widget 타입으로 선언된 auto_ptr의 a에 v[0]을 대입하게 되는 순간 값의 복사가 일어남과 동시에 v..
이번 장은 간단하면서도 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와 같은 알고리즘에서 적용될 적에..
item2의 주제는 컨테이너의 사용에 있어 코드의 독립적일 수 있을 거라는 환상을 조심하라 입니다. 우선 모든 STL은 템플릿이 가능하도록 설계되어 있습니다. 다시말해 STL로부터 얻을 수 있는 pointer,iterator, function 역시 템플릿되어 사용이 가능합니다. 때문에 이를 기초로 클래스등을 설계하면서 사용하는 STL을 선택하는데 주의를 필요로 합니다. 가령 라이브러리를 만들고 나서 개발자들이 이를 사용한다고 가정합니다. 하지만 추후에 라이브러리를 수정하면서 내부에서 사용하는 STL을 vector에서 map으로 바꿉니다. 물론 인터페이스는 그대로 이기에 사용자가 라이브러리의 클래스를 사용하거나 함수를 호출하는데 변경은 없습니다. 하지만 내부의 자료구조가 위 처럼 sequence conta..
item1은 어떠한 상황에서 적절한 STL을 선택할것인가에 대한 주제입니다. 1. 임의의 위치에 삽입할 일이 잦다면( vector::insert() ) 순차 컨테이너를 선택한다. - 연관 컨테이너는 이러한 작업을 할 수 없다. 단, insert와 같은 작업은 많은 비용이 발생하므로 신중해야 한다. (insert가 발생하면 모든 원소들을 이동시켜야한다. ) 2. 컨테이너에서 순서가 중요하지 않다면 hashed 컨테이너를 사용한다. (c11에서는 unordered로 변경 됨) 3. c++표준에 꼭 맞춰야 한다면 hashed 컨테이너와 slit, boost::rope는 사용하지 않는다. 4. 원소의 이동이 잦다면 연관메모리 컨테이너는 피하자. (1번과 배치되는 내용이며 선택에 주의가 필요하다. 상황에 맞게 선..
함수포인터에 대한 기초적인 사용 방법은 https://www.joinc.co.kr/w/Site/C/Documents/FunctionPointer 에서 참고바랍니다. 함수포인터의 사용의의라 하면 유연하게 코딩을 할 수 있다는데 있겠습니다. 또 코드의 양을 줄일수도 있습니다. 거두절미 하고 코드로 먼저 확인하겠습니다. 헤더파일에 typedef로 정의된 함수포인터는 두가지가 있습니다. ElementComprator ReturnValueComprator typedef로 정의해서 간략하게 함수포인터를 이용할 수 있습니다. 그렇지 않으면 일일이 함수의 헤더를 그대로 적어야겠죠. ElementComprator는 사용자정의 comp함수입니다. 클래스의 객체를 만들어 낼 때 매개변수로 넘길 수 있는데 이 함수포인터는 R..
c+11에서는 템플릿별칭에 대해서 typedef가 아닌 using을 사용하라고 권장하나 봅니다 ( http://occamsrazr.net/tt/174) 본 문제를 해결하기 위해 stackoverflow에 질문을 해보고 답변대로 해결되었습니다 http://stackoverflow.com/questions/42477805/how-can-i-resolve-this-matter-c-template-with-typede 알고리즘 문제를 풀기 위해 trep을 만드려는데 별칭과 템플릿에 관한 문제가 발생해서 한참을 뒤진 결과 드디어 '컴파일'하는데만 성공했네요 보시다시피 헤더파일과 cpp파일을 분리하려고 합니다. 우선 헤더파일에서 클래스 안에 pair에 대한 별칭을 주고 있습니다. 원래는 클래스 밖에서 이를 usin..
- Total
- Today
- Yesterday
- 드럼
- 피아노
- linux
- cpp
- 중국
- 사천
- 악보
- Codejam
- peram jam
- printf
- 코드잼
- 정규표현식
- 이루마
- 알고리즘
- yiruma
- STL
- Pointer
- 카카오 공채
- 여행
- regex
- Algorithm
- C language
- compile
- kernerl
- 문자열
- link
- Spring
- python
- 중국여행
- C++
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |