day8

发布时间 2023-08-27 11:34:16作者: skural
 适配器(Adaptors)是标准库中的一个通用概念,容器、迭代器和函数都有适配器。本质上,一个适配器是一种机制,能使某种事物的行为看起来像另外一种事物一样。

一个容器适配器(Container adaptors)接受一种已有的容器类型,使其行为看起来像一种不同的类型。标准库定义了三个序列容器适配器:stack、queue和priority_queue。

1.queue

queue是一个队列,实现先进先出的功能,queue不是标准的STL容器,却是以STL容器为基础,queue是在deque的基础上进行封装的,之所以选择deque而不选择vector是因为deque在删除元素的时候释放空间,同时在重新申请空间的时候无需拷贝所有元素。

queue的工作方式:

front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue 为空,返回值是未定义的。
push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back() 来完成的。
push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数 push_back() 来完成的。
pop():删除 queue 中的第一个元素。
size():返回 queue 中元素的个数。
empty():如果 queue 中没有元素的话,返回 true。
emplace():用传给 emplace() 的参数调用 T 的构造函数,在 queue 的尾部生成对象。
swap(queue<T> &other_q):将当前 queue 中的元素和参数 queue 中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板 swap() 来完成同样的操作。

queue没有迭代器,访问元素的唯一方式就是遍历容器内容,并访问移除过的每一个元素。

1 q.pop()    移除q的首元素或priority_queue的最高优先级的元素,返回void
2 q.front()    访问首元素或尾元素
3 q.back()    访问尾元素,只适用于queue
4 q.top()    访问最高优先级元素,只适用于priority_queue 
5 q.push(item)    在queue末尾或priority_queue中恰当位置创造一个元素,其值为item, 或者又args构造
6 q.emplace(args)    同上

2.stack

stack是实现先进后出的功能,和queue一样,也是内部封装了deque。stack的源代码原理和实现方式均跟queue相同。

stack 的一些操作:

 1 int main(int argc, const char * argv[]) {
 2     
 3     //定义stack对象
 4     stack<int> s1;
 5     
 6     //入栈
 7     s1.push(1);
 8     s1.push(2);
 9     s1.push(3);
10     s1.push(4);
11     
12     //打印栈顶元素,并出栈
13     while (!s1.empty()) {
14         //取出栈顶元素
15         cout << "当前栈顶元素" << s1.top() << endl;
16         
17         //获取栈的大小
18         cout << "当前栈的大小" << s1.size() << endl;
19         
20         //出栈
21         s1.pop();
22     }
23     
24     return 0;
25 }
 1 //定义类
 2 class Teacher {
 3     
 4 public:
 5     
 6     char name[32];
 7     int  age;
 8     
 9     void printT()
10     {
11         cout << "age = " << age << endl;
12     }
13     
14 };
15  
16 int main(int argc, const char * argv[]) {
17     
18     Teacher t1, t2, t3;
19     t1.age = 22;
20     t2.age = 33;
21     t3.age = 44;
22     
23     //定义栈容器
24     stack<Teacher> s1;
25     
26     //入栈
27     s1.push(t1);
28     s1.push(t2);
29     s1.push(t3);
30     
31     //出栈并打印
32     while (!s1.empty()) {
33         //打印栈顶元素
34         Teacher tmp = s1.top();
35         tmp.printT();
36         
37         //出栈
38         s1.pop();
39     }
40  
41     return 0;
42 }
1 stk.top()    访问栈顶元素
2 stk.push(value)    将value压入栈内
3 stk.emplace(seq)    用seq构造元素并压栈
4 stk.pop()    将当前栈顶元素出栈,返回类型void