STL

You are currently browsing articles tagged STL.

디지츠님이 남겨주신 리플을 보고 STL 같은 표준 라이브러리나 기타 여러 라이브러리들을 사용할 때 저도 그렇고 누구에게나 드는 의문일 거 같기 때문에 그에 대해 간단하게 저의 생각을 적어봤습니다.

“홀짝도 구분 못하는 STL 에서 볼 수 있듯이 C++ Standard Template Library 의 경우 표현력과 재사용성을 서로 trade-off 했기 때문에 STL 로만 코드를 짜는데는 표현력에 많은 제한이 있습니다. 제가 불평한 것도 그런 표현력이 몇가지 부분에 있어서 많이 부족했기 때문입니다. 하지만 오히려 그 덕분에 STL 로만 작성할 수 있는 경우에 그 코드의 가독성과 논리적 명확성은 오히려 더욱 뚜렷해진다고 생각합니다. 반면 아무런 라이브러리도 사용하지 않은, 언어 자체의 expression 과 statement 를 사용한 코드의 경우 그 표현에 있어서 제한이 없으니 더 쉬운 코드나 아니면 이해할 수 없을 정도로 복잡 다단한 코드도 나올 수 있을 겁니다. 따라서 저는 단순히 STL 사용 여부가 코드의 복잡성이나 가독성을 높이거나 낮춘다고 생각하지는 않습니다.

Read the rest of this entry »

Tags: , ,

다툴래? 나와 갈등을 빚어볼래? 같은 급의 제목인거 같지만[..] 여튼 오늘 심심해서 코딩해보다가 다시금 STL(Standard Template Library) 에 조금 실망하게 되는 점(?)이 있어서 글을 써봅니다. 우선 평상시에는 boost 를 거의 상용하기 때문에 이런 불편함을 못느꼈었는데 STL 만 사용하는 경우 가끔씩 이런 불편함을 느끼게 되네요. 사건의 발단(?)은 오늘 누군가 인터넷 게시판에 “정수 10개를 입력 받아서 홀수와 짝수를 구분하여 각각 출력”하는 문제의 소스 코드를 디버깅 해달라고 올린걸 본 것부터였습니다. 간단한 문제니까 한번 C++ 의 표준 라이브러리와 STL 가지고 짜볼까? 하는 생각이 들어서 짜보게 되었는데 그게 재앙의 시작일 줄은 그때는 미처 몰랐습니다[..]

평소에 주로 SGI 의 STL 문서를 보기 때문에 당연히 입력은 copy_n 으로 받고 홀짝 구분은 partition 과 compose1, bind2nd, equal_to, modulus 로 만들 생각이었습니다.

자, 문제 조건이 정수 10 개를 입력받는 거니까. 우선 정수 10 개를 입력 받아서 벡터로 복사해볼까?

vector<int> input;
copy_n(istream_iterator<int>(cin), 10, back_inserter(input));

… 컴파일 중 …

어라? 컴파일이 되지 않습니다?!
Read the rest of this entry »

Tags: , , ,

보통 C++ 프로그래머들이 코드를 작성할 때 STL 에 대한 믿음은 꽤나 크다. 나 역시 STL 은 범용적으로 사용 가능하도록 잘 최적화되어 있고 웬만한 프로그래머가 직접 짜는 것보다는 훨씬 잘 짜여져있다고 믿는 편이다. 대부분의 경우 이런 생각은 옳고 우리가 쉽게 생각하기 어려운 부분들까지 잘 고려되어서 구현되어 있다. 하지만 몇몇 부분에 대해서는 우리가 지나치게 STL 을 만능으로 생각하고 있거나 혹은 표준에 정의되어 있지않아서 실제 구현이 컴파일러마다 상당히 비효율적이기도 하다.

이번에 심심해서 grep-like 한 툴을 짜고 있는데 그 중 생각없이 std::string 의 find() 멤버 함수를 썼다가 알게된 점들에 대해서 포스팅을 한다.

우선 SGI 의 STL 레퍼런스를 참조해보자.

basic_string

size_type find(const basic_string& s, size_type pos = 0) const

Searches for s as a substring of *this, beginning at character pos of *this.

흐음 … 이제 뭔가 입질 감이 오지 않는가? 이렇게 구현에 대해 입 한번 뻥긋하지 않을 정도면 보통 두가지 결론이 나올 수 있다. 첫째는 우리가 생각할 필요없이 잘 구현되어 있다. 걱정하지 말고 사용해라. 라는 경우와 둘째는 표준에서 딱히 정해진게 없으니 구현에 따라 다를 수 있다. 라는 경우이다.

그런데 보통 STL 사용자들은 std::string 의 find() 멤버 함수면 적어도 스트링에 최적화된 서치 알고리즘이 구현되어 있으리라 예상한다. 하지만 과연 그럴까? 아래 코드를 한번 보자.

Read the rest of this entry »

Tags: , ,