C++容器简介1—stack
一、简介
stack是一种容器适配器(STL的容器分为顺序容器和关联容器,容器适配器),被设计来用于操作先进后出(FILO)结构的情景,在这种情况下, 元素的插入和删除都只能在容器的尾部进行。
stack通过容器适配器来实现,是一种将特定的容器类作为其最底层的容器的类,它提供了一些特定的成员函数来访问自己的元素,元素只能在这个特定容器的后面,也就是栈的顶部,进行出栈和入栈操作。
最底层的容器可以是任意一种标准的容器模板类,或者是一些有明确目的的容器类,他们应该支持以下操作:
empty(判断是否为空)
size (返回栈的元素个数)
back (返回栈顶元素)
push (入栈)
pop(出栈)
标准的容器类,比如vector,deque,list,满足以上需求。如果没有明确指定需要使用的容器,默认情况下将会使用deque。
二、stack相关函数用法
#include <iostream>
using namespace std;
#include <stack>
void main01() //栈模型
{
stack<int> s;
for (int i = ; i < ; i++)
{
s.push(i + ); //入栈
}
cout << "栈的大小: " << s.size() << endl;
while (!s.empty()) //出栈
{
int tmp = s.top(); //获取栈顶元素
cout << tmp<<" ";
s.pop(); //弹出栈顶元素
}
cout << endl;
}
class Teacher
{
public:
int age;
char name[];
public:
void printT()
{
cout << "age: " << age << endl;
}
};
void main02() //结构体
{
Teacher t1, t2, t3;
t1.age = ;
t2.age = ;
t3.age = ;
stack<Teacher> s;
s.push(t1);
s.push(t2);
s.push(t3);
while (!s.empty())
{
Teacher tmp = s.top();
tmp.printT();
s.pop();
}
}
void main03() //结构体指针
{
Teacher t1, t2, t3;
t1.age = ;
t2.age = ;
t3.age = ;
stack<Teacher*> s;
s.push(&t1);
s.push(&t2);
s.push(&t3);
while (!s.empty())
{
Teacher *p = s.top();
p->printT();
s.pop();
}
}
void main()
{
main01();
main02();
main03();
cout << endl;
cout << "Hello" << endl;
system("pause");
return;
}
1、empty()
返回当前栈是否为空(当它的大小是0的时候),empty()函数并不能清空栈,只是一个返回bool型的const函数。
stack<int>s;
s.push();
s.push();
cout << s.empty() << endl; //输出0
2、size()
返回容器中元素的个数,时间复杂度O(1),返回值类型是size_type,也就是unsigned int。size()函数不能改变栈的大小。
例如上面的代码段应该输出 2
3、top()
返回栈顶元素的引用。
由于栈是一种先进后出的结构,所以最顶部的元素就是最后插入栈的元素。
(C++11中会自动根据元素类型返回reference或者是const_reference,对一个空的栈调用top函数,会异常终止,所以应该使用empty()函数提前检查)
stack<int>s;
s.push();
s.push();
cout << s.top() << endl; //输出2
s.top() += ; //引用可以作为左值
cout << s.top() << endl; //输出5
4.push()和emplace()(c++11)
push()函数和emplace()都是在栈这个容器的顶部插入一个新的元素。
push(),实际上是调用的底层容器的push_back()函数,新元素的值是push函数参数的一个拷贝。
emplace(),实际上是调用的底层容器的emplace_back()函数,新元素的值是在容器内部就地构造的,不需要移动或者拷贝。
stack的emplace也可以用在普通的基本类型上。
struct Node
{
Node(int x)
x(x){}
int x;
};
int main()
{
stack<Node>s1;
s1.emplace();
s1.push(Node());
stack<int>s2;
s2.emplace(); //OK
return ;
}
5、pop()
删除最顶部的元素,使栈的大小减小。
这个被删除的元素,是刚刚插入栈的元素,这个元素和top函数的返回值是一致的。这个函数会调用对象的析构函数(如果有的话),pop()实际上是用过底层容器的pop_back()函数实现的。
(对一个空栈进行pop(),会导致程序异常终止,应该使用empty提前检查 )
stack<int>s;
s.push();
s.push();
s.push();
cout << s.top() << endl; //
s.pop();
cout << s.top() << endl; //
栈没有clear或者erase函数,如果想要清空一个栈,需要循环的调用出栈函数。
stack<int>s;
//s.erase(); //error
//s.clear(); //error
s.push();
s.push();
s.push();
cout << s.size() << endl; //
while(!s.empty())
s.pop();
cout << s.size() << endl; //
6、swap()
交换两个栈的内容(所有元素),这个函数通过非成员函数swap()来交换底层容器,时间复杂度O(1)
// stack::swap
#include <iostream>
using namespace std;
#include <stack>
int main ()
{
std::stack<int> foo,bar;
foo.push (); foo.push(); foo.push();
bar.push (); bar.push();
foo.swap(bar);
std::cout << "size of foo: " << foo.size() << '\n';
std::cout << "size of bar: " << bar.size() << '\n';
return ;
}
7、运算符重载
比较:先大小,后元素
(1) ==
template <class T, class Container>
bool operator== (const stack<T,Container>& lhs, const stack<T,Container>& rhs);
(2) 重载 !=
template <class T, class Container>
bool operator!= (const stack<T,Container>& lhs, const stack<T,Container>& rhs);
(3) 重载 <
template <class T, class Container>
bool operator< (const stack<T,Container>& lhs, const stack<T,Container>& rhs);
(4) 重载 <=
template <class T, class Container>
bool operator<= (const stack<T,Container>& lhs, const stack<T,Container>& rhs);
(5) 重载 >
template <class T, class Container>
bool operator> (const stack<T,Container>& lhs, const stack<T,Container>& rhs);
(6) 重载 >=
template <class T, class Container>
bool operator>= (const stack<T,Container>& lhs, const stack<T,Container>& rhs);例子:
stack<int>l1;
l1.emplace();
l1.emplace();
l1.emplace();
stack<int>l2;
l2.emplace();
l2.emplace();
cout << boolalpha << (l1 > l2) << endl; //T
cout << boolalpha << (l1 == l2) << endl; //F
cout << boolalpha << (l1 != l2) << endl; //T
C++容器简介1—stack的更多相关文章
- java web分享ppt大纲 -- servlet容器简介
今天在公司分享了java web的ppt,把ppt大纲放在这里,希望可以帮助需要的人 servlet容器简介 定义 狭义上的,servlet容器为java Web应用提供运行时环境,负责管理servl ...
- STL容器简介
stl不是面向对象的编程,而是一种不同的编程模式————泛型编程 我们常用到的STL容器有vector.list.deque.map.multimap.set.multiset 顺序性容器:vecto ...
- Docker 容器简介与部署
关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...
- Spring(二)核心容器 - 简介 、BeanFactory、ApplicationContext
目录 前言 1.容器简介 2.容器的结构 2.1 BeanFactory 2.2 ApplicationContext 2.2.1 ConfigurableApplicationContext 2.2 ...
- Spring源码-IOC部分-容器简介【1】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- stl容器学习——queue,stack,list与string
目录 头文件 string 目录部分 1.string的定义及初始化 ① 用一个字符串给另一个字符串赋值 ②用字符串常量对字符串进行赋值 ③ 用n个相同的字符对字符串赋值 2.string的运算符及比 ...
- [转载]Java集合容器简介
Java集合容器主要有以下几类: 1,内置容器:数组 2,list容器:Vetor,Stack,ArrayList,LinkedList, CopyOnWriteArrayList(1.5),Attr ...
- 容器适配器之stack
参见http://www.cplusplus.com/reference/stack/stack/ template<class T, class Container = deque<T& ...
随机推荐
- (3) esp8266 官方库文件,没有求逆函数
下载库文件 #include <MatrixMath.h> #define N (2) mtx_type A[N][N]; mtx_type B[N][N]; mtx_type C[N][ ...
- Linux CentOS7 字符集
CentOS 7字符集的问题与6有点区别,会出现下面问题,查看是中文,vi进入就变成乱码了 生产中修改配置文件 [root@ce1d2002a999 ~]# cat /etc/locale.conf ...
- Vue.directive全局自定义指令案例
今天正好这个知识点有点淡忘了,就随笔一下吧: Vue.directive(参数1,参数2) 参数1:指令名称,如"drag" 参数2:指令要实现的回调函数,其中回调函数中也有两个参 ...
- 使用terraform v0.12 生成gitlab repo 创建部署tf 文件
以前写过一个使用模版引擎+ rest 接口的模式,生成tf 文件,v0.12 直接提供了方便的json 处理函数 我们可以直接结合http 以及templatefile providers 方便的 ...
- 控制论模型&心流模型&波模型
1.控制论模型 这是对设定的目标,通过多次输入和输出,反馈调节,最终达成目标的方法.广泛运用于自然科学与社会科学中.反馈的周期长短决定了调节精度的大小以及达到目标的速度.反馈结果与目标背离的立即纠正, ...
- 查看服务器内存、CPU、网络等占用情况的命令--汇总
搭建测试环境过程中,需要对正在使用的aws服务器(实际这是一台虚拟出来的服务器),查看它在运行脚本,启动脚本时的内存,CPU,网络等使用情况 1.查看服务器cpu内核个数: -cat 每个物理cpu中 ...
- 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World
目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...
- Scala函数柯里化(Currying or Curry)
柯里化(Currying) 把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术. 简单的实现如下: scala> def ...
- Java8新特性 (一)Lambda
目录 一.Lambda介绍 二.Lambda用法实例 三.Lambda变量作用域 前言: 这两天彻底的复习了一遍Java8的各种新特性,趁着热乎劲,把知识点整理成博客的形式保存一下. 一.Lambda ...
- Oracle 优化SQL
https://www.cnblogs.com/ios9/p/8012611.html 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2 ...