이번 50주년 조용필 서울콘서트를 다녀왔습니다. 조용필 노래는 군대에 있을 때 처음 접했습니다. 가왕이라는것만 알고 있었고 히트곡 위주로 몇개만 알고 있었지 특별히 찾아 들어본적은 없었죠. 하지만 당시에 앨범 단위로 노래를 들어보며 깜짝 놀랐습니다. 시도하는 장르하며 노래, 앨범의 완성도는 대단했습니다. 20분 여에 달하는 대곡의 실험적인 노래까지 있는것을 보고 감탄하기도 했었죠. 노래도 좋지만 가사가 좋은것도 큰 매력이었습니다. 생각해보면 외국곡은 다 좋은데 가사를 모르고 듣는 경우가 대부분이고 알고 듣는다 하여도 정서가 다르니 마음에 와닿는게 덜할 수 밖에 없는것도 사실입니다. 어쨋든 그렇게 조용필이란 가수 혹은 밴드 위대한 탄생의 노래를 접한지 몇년이 지나고 드디어 콘서트를 다녀왔습니다. (지금 안..
얼마전부터 예전에 만든 프로젝트를 리팩토링하려 리눅스 환경에서 gcc를 이용해 프로젝트를 컴파일 하려는데 for each문에서 syntex error가 났습니다. 문제되던 해당 소스는 visual studio 2015(c++14) 에서 작성한 소스 였는데 c++을 지원하는 gcc6 에서 에러가 나는것입니다. 처음에는 ide로 사용하는 eclipse cdt 에서 c++11를 제대로 못찾는건가 싶어서 몇일을 삽질하였는데 알고보니 다음과 같은 문제였습니다. https://stackoverflow.com/questions/22836277/what-is-the-difference-between-for-each-in-and-for for each문은 msvc에서 가능한 문이며 호환성을 위해서는 for를 사용하되 :..
이번편은 컨테이너의 포인터 타입에 대해 비교타입을 특정하라입니다. 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..
smarter pointer의 일종인 auto_ptr의 특징과 stl의 주요 특징인 '모든 원소의 접근은 값의 복사가 기본이다'를 상기한다면 이 챕터의 이야기는 매우 간단해집니다. auto_ptr은 최초에 할당이 이루어지고 대입이 이루어질 때 마다 권한이 위임되어 원래의 포인터는 null이 됩니다. 문제는 stl의 기본 동작은 다음을 전제한다는 점입니다. '모든 원소의 대입은 값 복사가 기본이다' 다시말해 operator[], =,at같은 원소들은 컨테이너의 원소가 복사되지 포인터나 레퍼런스를 반환하지 않습니다. 따라서 stl에서의 auto_ptr의 사용은 다음과 같은 문제를 야기합니다. . Widget 타입으로 선언된 auto_ptr의 a에 v[0]을 대입하게 되는 순간 값의 복사가 일어남과 동시에 v..
이번 장은 간단하면서도 STL사용에 있어 중요한 장입니다. 제목과같이, 컨테이너의 요소로써 포인터를 사용한다면 컨테이너가 소멸되기전 필수로 각 객체의 메모리를 해제하라입니다. 위의 코드는 단번에 문제가 어디서 발생하는지 알 수 있습니다. 컴파일도 잘되며 실행하는데 런타임에 죽거나 하는 문제가 생기지 않을것입니다. 하지만 메모리의 누수는 심각한 문제로 다가옵니다. 작은 프로그램에서, 요즘같은 성능이 좋은 컴퓨터에서야 얼마나 문제가 발생하겠냐만 컨테이너에 들어가 있던 객체 몇십만개 였다면? 그 객체 자체의 크기가 크다면? 또는 그 객체가 물고 있던 메모리들은? (객체의 소멸자가 호출되어 물고 있던 자원을 해제한다면) 또는 서버와 같이 오랫동안 메모리에 올라가 있어야할 프로그램에서 꾸준히 메모리 누수가 발생한..
- Total
- Today
- Yesterday
- yiruma
- Pointer
- 중국여행
- peram jam
- 여행
- 카카오 공채
- Spring
- C language
- compile
- 드럼
- STL
- 문자열
- 피아노
- 정규표현식
- 사천
- 악보
- linux
- python
- C++
- printf
- 이루마
- 중국
- kernerl
- 코드잼
- Codejam
- Algorithm
- cpp
- 알고리즘
- regex
- link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |