STL源码分析functor和adapter

简介

STL的六大部件分别是容器、迭代器、算法、仿函数、适配器和分配器。分配器主要是用来分配内存空间的,其底层实现就是malloc。容器、迭代器和算法在前面的文章已经写过。这篇文章主要是简要分析functor和adapter。

functors

前面已经说过仿函数在算法中有着重要的应用。下面是在算法sort中调用不同仿函数的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// using default comparison
sort(vec.begin(), vec.end());
// using function as comp
bool myfunc(int i, int j)
{
return i < j;
}
sort(vec.begin(), vec.end(), myfunc);
// using object as comp
struct myclass
{
bool operator()(int i, int j)
{
return i < j;
}
} myobj;
sort(vec.begin(), vec.end(), myobj);
// using explicitly default comparison
sort(vec.begin(), vec.end(), less<int>);
// using another comparision criteria
sort(vec.begin(), vec.end(), greater<int>);

另外要注意的是在标准库中定义的仿函数都继承了unary_function(一元操作符函数)或者binary_function(二元操作符函数),这两个都只是对类型进行了定义。

adapters

stack、queue是两个典型的容器适配器。两者都是在底层上使用了别的容器,并把自己的函数封装在底层容器的函数上,相当于是为别的容器套了一个壳而已。下面是stack的源代码,应该说能比较明显地看出来其原理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// stack
template <class T, class Sequence = deque<T>>
class stack
{
public:
typedef typename Sequence::reference reference;
typedef typename Sequence::const_reference const_reference;
typedef typename Sequence::size_type size_type;
typedef typename Sequence::value_type value_type;
protected:
Sequence c; // 底层容器
public:
bool empty() const {return c.empty(); }
size_type size() const {return c.size(); }
reference top() { return c.back(); }
const_reference top() const {return c.back(); }
void push(const value_type &x) {c.push_back(x); }
void pop() { c.pop_back(); }
}

总结

到此为止,STL的主要内容应该说已经学的差不多了。侯捷老师的课程讲的确实详细,后面打算实现个简单的STL版本,以加深学习的印象。

声明

若有错误,欢迎讨论。严禁抄袭,仅用于学习。

坚持原创技术分享,您的money将鼓励我继续创作!