适配器(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