[C++] STL 알고리즘 기본

STL을 사용함에 있어서 STL을 자료구조로써만 바라봤고 자료구조로써만 사용했습니다. 견고하면서 빠르며 융통성이 뛰어난 자료구조로써 말입니다. 이 자료구조에 대한 연산, 즉 알고리즘에 대해서는 간과했고.. 필요한 연산은 STL에서 제공해주고 있다는 것을 알고 있음에도 그냥 제 스스로 코드를 만들 써 왔습니다.

예를 들어서 자료구조로써 링크드 리스트(Linked List)는 STL에서 list 입니다. 자료구조로써 아래와 같이.. 저에겐 매우 익숙한 코드로 데이터를 저정합니다.

#include 
#include 

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    list values;
 
    values.push_back(100);
    values.push_back(200);
    values.push_back(150);
    values.push_back(250);

    ... // values의 사용

    return 0;
}

링크드 리스트라는 자료구조가 필요했고.. 매우 효율적이면서도 매우 견고한 링크드 리스트의 구현체로써 STL을 사용해 데이터를 저장합니다. 여기서 저장된 데이터 중 가장 큰 값이 필요할 경우 저는 의례 다음처럼 코딩을 해왔습니다.

list::iterator it;
double minValue = DBL_MAX;
for(it=values.begin(); it!=values.end(); ++it) {
    if(*it < minValue) minValue = *it;
}

printf("%lf\n", minValue);

실제로.. 이렇게 사용해 왔는데요. 아마도 STL을 저보다 더 잘 사용하시는, 대부분 그러하시겠지만.. 정말 이렇게 코딩을 했다고? 하며 실소를 금치 못하실거라 생각됩니다. 네.. 반성중입니다. 다시 초심으로 돌아가서.. 이러한 무지를 버리고 STL에서 제공하는 본연의 기본 알고리즘을 활용하려기에 이 글을 작성해 봅니다.

그렇다면 위의 최소값을 얻기 위한 STL의 방식은 무엇일까요? 아래와 같이 최적화되었으며 빠르며 명확한 방법을 제공합니다.

    list::iterator it;

    it = min_element(values.begin(), values.end());
    printf("%lf\n", *it);

최소값이 아닌 최대값을 구하는 함수는 max_element입니다.

이외에도 어떤 값을 갖는지를 판단하는 함수의 경우는 다음 코드와 같습니다.

    list::iterator it;

    it = find(values.begin(), values.end(), 200);
    if(it != values.end())
    {
        printf("Got it!");
    }

STL에서는 이처럼 매우 효율적인 방식의 알고리즘 함수를 많이 제공하지만 끝으로 정렬 함수를 소개하면서 마무리 하고자 합니다.

sort(values.begin(), values.end());

이제.. 이렇게 블로그를 통해 정리를 해 놓았으니 향후 STL을 이용해 자료구조로써 뿐만 아니라 알고리즘 연산에 대해서도 최대한 STL을 사용해 봐야겠습니다.

[ActionScript] 문자열에 대한 Trim 함수

액션 스크립트는 문자열에 대한 Trim 함수를 제공하지 않습니다. 해서 제가 사용하고 있는 Trim 함수를 소개해 드립니다. 재귀호출 함수를 사용해서 그다지 속도는 나질 않지만…. 제가 사용함에 있어서 문제가 없기에 소개해 드립니다.

public class StringHelper
{
    static public function trim(str:String, char:String):String {
        return trimBack(trimFront(str, char), char);
    }
  
    static public function trimFront(str:String, char:String):String {
        char = stringToCharacter(char);
        if (str.charAt(0) == char) {
            str = trimFront(str.substring(1), char);
        }
        return str;
    }
  
    static public function trimBack(str:String, char:String):String {
        char = stringToCharacter(char);
        if (str.charAt(str.length - 1) == char) {
            str = trimBack(str.substring(0, str.length - 1), char);
        }
        return str;
    }

    static public function stringToCharacter(str:String):String {
        if (str.length == 1) {
            return str;
        }
        return str.slice(0, 1);
    }
}

사용방법은 StringHelper.trim(”    ABC    “, ” “)와 같으며 이에 대한 결과는 “ABC”가 됩니다. 참고로 이 함수는 제가 만든 것이 아니고 외국의 블로그에서 발췌해 사용한 것인데… 어느 블로그인지.. 시간이 많이 흘러 알수가 없네요..

CSV에서 컴마(,) 표현은?

CSV에서 데이터의 구분자로 컴마(,)를 사용하는데.. 그렇다면 값으로써 컴마(,)의 표현법은?

“,”

그렇다면, 쌍따움표의 표현법은?

“””

예를 들어서, “가나다”를 CSV로 표기하면, “””가나다”””가 됨.