C++STACKとpairの基本的な使い方
21593 ワード
STACK
Stack(スタック)は、STLのSTACKを用いた後進先出のデータ構造に必要なヘッダファイルである
stackはdequeに基づいて実装されたdequeに相当する両端キューが一端を閉じた
stackの構造
&.1
&.2
&.3
&.4
&.5
メンバー関数
push
push関数はパラメータ要素をスタックに追加し、戻り値はありません(たとえば、ここでは0,1,2,3,4をスタックに追加します.スタックトップ要素は4であることに注意してください).size
size関数はスタックのサイズを返します(5つの要素がある場合、size=5)empty
Empty関数はbool値を返し、スタックが空の場合trueを返します.そうでない場合false topを返します.
top関数の戻り値はスタックトップ要素(スタックトップ要素popは削除されていないことに注意
pop関数はスタックトップ要素を削除し、値emplaceを返さない
emplace関数は、pushとは異なる、Nodeのコンストラクション関数のパラメータに直接emplaceを伝達し、構築要素をスタックにmystackを加えることができる.push(1,2);//コンパイルに失敗した場合、上記の効果を達成するには、mystackなどの手動構造が必要です.push(Node(1,2));
pair
pairは2つのデータを組み合わせたデータのセットであり、pairの実装は構造体であり、主な2つのメンバー変数はfirst secondでありstructを使用するのはclassではないため、pairのメンバー変数を直接使用することができる.ヘッダファイル
クラステンプレート:
パラメータ:T 1は1番目の値のデータ型であり、T 2は2番目の値のデータ型である.機能:pairは1対の値(T 1とT 2)を1つの値に組み合わせ、
pairを作成pairオブジェクトを作成するには、2つのタイプ名を指定する必要があります.2つの対応するタイプ名のタイプは同じではありません.
インスタンスは、ユーザーがツイートを送信したり、他のユーザーに注目/キャンセルしたりして、自分を含む最近の10のツイートを見ることができる簡略版のツイッターを設計します.あなたの設計には、以下の機能が必要です.
postTweet(userId,tweetId):新しいツイートgetNewsFeed(userId):最近の10個のツイートを取得します.各ツイートは、ユーザが注目している人またはユーザ自身が発行しなければならない.推文は時間順に最近の開始順に並べ替えなければなりません.follow(followerId,followeeId):ユーザーに注目unfollow(followerId,followeeId):ユーザーに注目しない
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/design-twitter著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
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);//
}
};