前言:
在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来。
在这一篇文章中,我们主要对STL中的容器适配器进行简单的介绍。
正文:
1. stack
stack是后进先出的数据结构,只能插入,删除,访问栈顶的元素。
可以用vector,list,deque来实现,在缺省情况下(缺省即默认),用deque实现(也就是说stack在你不特别定义它是其他的容器来实现时,默认是用deque来实现的,下面讲到的其他容器适配器也是这样)。用vector和deuqe实现,比用list实现性能好。
template<class T, class Cont = deque<T>>
class stack
{
.......
};
stack上可以进行以下操作:
push 插入元素
pop 弹出元素
top 返回栈顶元素的引用
2. queue
和stack基本类似,可以用list和deque实现。缺省情况下用deque实现。
template<class T, class Cont = deque<T>>
class queue
{
.......
};
同样也有push,pop,top函数。(这些东西数据结构都有讲)
但是push发生在队尾;top发生在队头。先进先出。
有back成员函数可以返回队尾元素的引用
3. priority_queue
template<class T, class Cont = deque<T>,class Compare = less<T>>
class priority_queue
{
.......
};
和queue类似,可以用vector和deque实现。缺省情况下用vector实现。
priority_queue通常用堆排序技术实现,保证最大的元素总是在最前面。即执行pop操作时,删除的是最大的元素;执行top操作时,返回的是最大元素的引用。(这个引用是const的,不能修改)默认的元素比较器是less<T>(就是默认从小到大排序嘛,用“<”来排序)(这不就是队列版的multiset嘛)
push,pop的时间复杂度O(logn)
top()时间复杂度O(1)
样例:
1 #include<queue> 2 #include<iostream> 3 using namespace std; 4 int main(int argc, char const *argv[]) 5 { 6 priority_queue<double> pq1; 7 pq1.push(3.2); 8 pq1.push(9.8); 9 pq1.push(9.8); 10 pq1.push(5.4); 11 while (!pq1.empty()) 12 { 13 cout<<pq1.top()<<" "; 14 pq1.pop(); 15 }//输出:9.8 9.8 5.4 3.2 16 cout<<endl; 17 priority_queue<double,vector<double>,greater<double>> pq2; 18 //虽然默认是用vector来实现的,这里再用vector也没问题, 19 //这里是由于要用后面的比较的方法,就要把它给出来 20 pq2.push(3.2); 21 pq2.push(9.8); 22 pq2.push(9.8); 23 pq2.push(5.4); 24 while (!pq2.empty()) 25 { 26 cout<<pq2.top()<<" "; 27 pq2.pop(); 28 }//输出:3.2 5.4 9.8 9.8 29 30 return 0; 31 }
4. 容器适配器的元素个数
stack,queue,priority_queue都有
empty()成员函数用于判断适配器是否为空
size()成员函数返回适配器中元素个数
后记:
学之前不理解“容器适配器”是个啥玩意,学完之后突然理解,容器适配器这五个字拆开,“容器的适配器”,容器有我们之前最知道的deque,vector,list那些,而stack,queue,priority_queue这些容器适配器都通过这几个容器实现,也可以称作这几个适配于容器,哎呀,感觉越讲越乱了,反正就是适配器可以用容器来实现就对了。8说了,下篇笔记见。