stack

先入后出,只有top的一个元素是可见的。在前面c语言部分已有图示,参考

https://www.cnblogs.com/qifeng1024/p/12512765.html

惯例引入头文件

#include <stack>

首先定义一个栈

stack<string> s;

这样做是没有问题的。

但是我也可以在声明这个栈同时也规定底层容器

stack<string,list(string)> s;

同时也可以在声明的时候初始化这个栈

    vector<int> a{1,2,3,4};
    stack<int> s1;
    stack<int ,vector<int>> s2;
    stack<int ,vector<int>> s3(a);

成员函数如下:

 这是网页自己翻译的其中有的不是很准

int main()
{
   vector<int> a{1,2,3,4,5,6,7,8};

    stack<int ,vector<int>> s(a);


    cout<<"size    :  "<<s.size()<<endl;    //栈大小

    if(s.empty())   //判断栈是否空
    {
        cout<<"empty :  empty"<<endl;
    }
    else
    {
        cout<<"empty  : full"<<endl;
    }

    cout<<"top data is :  "<<s.top()<<endl; //访问栈顶元素
    s.pop(); //移除栈顶元素
    cout<<"size    :  "<<s.size()<<endl;    //栈大小  
    cout<<"top data is :  "<<s.top()<<endl; //访问栈顶元素
    s.push(199);    //在栈顶加入元素
    cout<<"size    :  "<<s.size()<<endl;    //栈大小
    cout<<"top data is :  "<<s.top()<<endl; //访问栈顶元素
    s.emplace(17);  //栈顶加入元素
    cout<<"size    :  "<<s.size()<<endl;    //栈大小
    cout<<"top data is :  "<<s.top()<<endl; //访问栈顶元素

}

emplace函数直接构造而非拷贝元素。 
调用insert或者push函数时,将对象当做参数传递,这些对象被拷贝到容器中。 
调用emplace函数时,将对象传递给对应元素类型的构造函数,直接在内存中构造对象。

empalce会在容器管理的内存空间中直接创建对象,调用push则会创建一个临时对象,然后将其压入容器。 
显然这种方式更适合将类插入到某容器中,而且会调用构造函数,这就需要那个类有合适的构造函数,参数必须能匹配构造函数。

原文地址:https://www.cnblogs.com/qifeng1024/p/12614943.html