C++STACKとpairの基本的な使い方

21593 ワード

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とは異なる、Nodeのコンストラクション関数のパラメータに直接emplaceを伝達し、構築要素をスタックに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の実装は構造体であり、主な2つのメンバー変数はfirst secondでありstructを使用するのはclassではないため、pairのメンバー変数を直接使用することができる.ヘッダファイル
#include 

クラステンプレート:
template<class T1,class T2> struct pair

パラメータ:T 1は1番目の値のデータ型であり、T 2は2番目の値のデータ型である.機能:pairは1対の値(T 1とT 2)を1つの値に組み合わせ、
                   (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オブジェクトを作成するには、2つのタイプ名を指定する必要があります.2つの対応するタイプ名のタイプは同じではありません.
pair<string, string> anon;        //        anon,        string
pair<string, int> word_count;     //         word_count,          string int  
pair<string, vector<int> > line;  //        line,         string vector  

インスタンスは、ユーザーがツイートを送信したり、他のユーザーに注目/キャンセルしたりして、自分を含む最近の10のツイートを見ることができる簡略版のツイッターを設計します.あなたの設計には、以下の機能が必要です.
postTweet(userId,tweetId):新しいツイートgetNewsFeed(userId):最近の10個のツイートを取得します.各ツイートは、ユーザが注目している人またはユーザ自身が発行しなければならない.推文は時間順に最近の開始順に並べ替えなければなりません.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);//  
    }
};