Standard Template Library(STL)

Iterators

structure에 관계 없이 동일한 동작의 코드를 구현할 수 있도록 돕는다.

구현하려는 알고리즘에 따라서 iterator에 요구하는 연산자가 다른다. 예를 들어 find의 경우, 읽을 수만 있으면 되기에 ++ 연산자로 충분하다. sort의 경우에는 임의의 위치로 읽고 쓸 수 있어야하기에 + 연산자가 필요하다. 따라서 STL은 5종류의 iterator을 정의한다. iterators

Container

Container란 다른 객체나 타입들을 저장할 수 있는 객체이다. STL에는 크게 세가지 종류의 container가 존재한다.

  • container
  • sequence container : vector, array, stack, queue, deque, priority_queue, list, forward_list
  • associative container : set, multiset, map, multimap

Associative container는 key와 값을 묶어 Tree 구조로 저장한다. 한편, unordered associative container는 hash table 구조로 구현되어 있다.

Function Objects(functors)

마치 함수처럼 괄호 연산자 ‘()’를 사용할 수 있는 객체를 functor라고 부른다.

class Functor {
public:
    double operator() (double x) { return x * 2.0; }
};
Functor f;
double y = f(5.0);  // equivalent as f.operator() (5.0);

또한 STL 함수들은 functor를 argument로 받을 수도 있다.

bool tooBig(int n) { return n > 100; }
list<int> scores;
scores.remove_if(tooBig);
// maybe
void list::remove_if(functor?) {
    for (int n : this) {
        if (functor(n))
            this.remove(n);
    }
}

// make toobig as class
template<class T>
class TooBig {
private:
    T cutoff;
public:
    TooBig(const T& t) : cutoff(t) {}
    bool operator() (const T& v) { return v > cutoff; }
};
list<int> scores;
scores.remove_if(TooBig<int>(200));

위의 코드는 [tooBig.cpp]에서 완성해보겠다.

STL Algorithms

initializer_list Template

Questions?

Q1.
A1.

Q2.
A2.

[functor.cpp]: [tooBig.cpp]: