C++ STACK与pair的基本用法

STACK

Stack(栈)是一种后进先出的数据结构
使用STL的STACK需要的头文件

#include一个头文件

stack是基于deque实现的 相当于 deque双端队列 封闭了一端

stack的构造

&.1

stack< int > first ; // 构造一个存放int类型的空栈,size=0;

&.2

deque<int> mydeque (3,100);          //构造一个包含3个int元素的双端队列
stack<int> second (mydeque);         //用自己的双端队列构造一个栈(size=3)

&.3

stack<int,vector<int> > third;          //指明用vector实现一个栈(存放int),空栈size=0
    

&.4

v


ector<int> myvector (2,200);        //构造一个存放2个元素的vector

&.5

stack<int,vector<int> > fourth (myvector);   //用自己的vector构造一个栈,size=2

成员函数

push

mystack.push(i);       

push函数将参数元素加入栈中,没有返回值(例如这里循环将0,1,2,3,4加入栈中,注意栈顶元素是4)
size

`mystack.size()` 

size函数返回栈的大小(如果有5个元素,size=5)
empty

mystack.empty()

empty函数返回一个bool值,栈为空时返回true,否则返回false
top

 mystack.top();

top函数的返回值是栈顶元素(注意并没有删掉栈顶元素
pop

 mystack.pop();         

pop函数将栈顶元素删掉,没有返回值
emplace

stack<Node> mystack;
mystack.emplace(1,2);     

emplace函数可以将一个元素加入栈中,与push的区别在于:emplace可以直接传入Node的构造函数的参数,并将构造的元素加入栈中
mystack.push(1,2); //编译不通过,要达到上面的效果需要手动构造,例如mystack.push(Node(1,2));

Node p = mystack.top();
cout << p.a << " " << p.b << endl;

stack<Node> my2;
my2.swap(mystack);            //swap函数可以交换两个栈的元素

pair

pair是将2个数据组合成一组数据, pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。。
头文件

#include 

类模板:

template<class T1,class T2> struct pair

参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:pair将一对值(T1和T2)组合成一个值,

    这一对值可以具有不同的数据类型(T1和T2),
    两个值可以分别用pair的两个公有函数first和second访问。
    pair p1;            //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);    //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2);          // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                    // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2;                  // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                   // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员
————————————————

创建pair
在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同

pair<string, string> anon;        // 创建一个空对象anon,两个元素类型都是string
pair<string, int> word_count;     // 创建一个空对象 word_count, 两个元素类型分别是string和int类型
pair<string, vector<int> > line;  // 创建一个空对象line,两个元素类型分别是string和vector类型

实例
设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:

postTweet(userId, tweetId): 创建一条新的推文
getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。
follow(followerId, followeeId): 关注一个用户
unfollow(followerId, followeeId): 取消关注一个用户

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-twitter
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Twitter {
private:
    /*2个哈希表*/
    unordered_map<int,set<int>> userId2follow;
    unordered_map<int,stack<pair<int,int>>> userId2Tweet;
    int counter;//计数器
public:

    Twitter() {
        counter=0;//计数器初始化
    }
    
    void postTweet(int userId, int tweetId) {
        /*添加推特,记得counter++*/
        userId2Tweet[userId].push({tweetId,counter++});
    }
    
    vector<int> getNewsFeed(int userId)
    {
        vector<int> res;
        /*加入userId本身的推特栈*/
        vector<stack<pair<int,int>>> tmp={userId2Tweet[userId]};
        
        for(set<int>::iterator ite=userId2follow[userId].begin();ite!=userId2follow[userId].end();ite++)
        {   
            /*注意用户关注其本身的操作!这里要将这种情况排除*/
            if(*ite!=userId)
                /*将userId所关注的其他用户的推特栈加入tmp*/
                tmp.push_back(userId2Tweet[*ite]);
        }

        for(int i=0;i<10;i++)
        {
            /*记录最大值和索引*/
            int maxindex,maxval=-1;
            for(int j=0;j<tmp.size();j++)
            {
                if(!tmp[j].empty() && tmp[j].top().second>maxval)
                {
                    maxval=tmp[j].top().second;//保存最大值
                    maxindex=j;//保存索引
                }
            }

            if(maxval==-1) break;//所有栈都为空
            res.push_back(tmp[maxindex].top().first);//将推特id加入res
            tmp[maxindex].pop();
        }
        return res;
    }
    
    void follow(int followerId, int followeeId) {
        userId2follow[followerId].insert(followeeId);//关注
    }
    
    void unfollow(int followerId, int followeeId) {
        userId2follow[followerId].erase(followeeId);//取关
    }
};

你可能感兴趣的:(学习日志)