容器适配器是一个封装序列容器的类模板。
stack<T>:是一个封装deque<T>容器的适配器类模板,默认实现的是一个后入先出的压入栈。stack<T>模板定义在头文件stack中。
queue<T>:是一个封装deque<T>容器的适配器类模板,默认实现的是一个先入先出的队列。queue<T>模板定义在头文件queue中。
priority_queue<T>:是一个封装vector<T>容器的适配器类模板,默认实现的是一个会对元素排序,从而保证最大元素总在队列最前面的队列。prioriy_queue<T>模板定义在头文件queue中。
1、stack用法详解
和其他序列容器相比,stack是一类存储机制简单、所提供操作较少的容器。stack容器可以提供的一套完整操作:
top():返回一个栈顶元素的引用,类型为T&.如果栈为空,返回值未定义。
push(const T& obj):可以将对象副本压入栈顶。这是通过调用底层容器的push_back()函数完成的
push(T&& obj):以移动对象的方式将对象压入栈顶。通过调用底层容器的有右值引用参数的push_back()函数完成的。
pop():弹出栈顶元素。
size():返回栈中元素的个数。
empty():在栈中没有元素的情况下返回true。
emplace():用传入的参数调用构造函数,在栈顶生成对象。
swap(stack<T>& other_stack):将当前栈中的元素和参数中的元素交换。参数所包含元素的类型必须和当前栈的相同。对于stack对象有一个特例化的全局函数swap()可以使用。
2、queue用法详解
只能访问queue<T>容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。
3、堆用法详解
堆(heaps)不是容器,而是一种特别的数据组织方式。堆一般用来保存序列容器。树是分层排列的元素或节点。每个节点有一个键,它是节点中所保存的对象,就如同链表中的节点。
现在可以定义一个堆:这个堆是一个完全二叉树,每个节点与其子节点位置相对。父节点总是大于或等于子节点,这种情况下被叫作大顶堆,或者父节点总是小于或等于子节点,这种情况下叫做小顶堆。
queue操作:queue和stack有一些成员函数类似
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):将当前queue中元素和参数queue中的元素交换。它们需要包含相同类型的元素。也可以调用全局函数模板swap()来完成同样的操作。
std::deque<double> values {1.5, 2.5, 3.5, 4.5};
std::queue<double> numbers(values);
while (!numbers.empty())
{
std ::cout << numbers. front() << " "; // Output the 1st element
numbers. pop(); // Delete the 1st element
}
std::cout << std::endl;