STL 一些經常用到的東西 stack queue deque vector map set unique lower_bound()

先說一下  一邊要用到算法的東西一般要加#include<algorithm>頭文件

一、棧和隊列  

1 棧 :一種線性表  

    特點  後進先出

   頭文件  #include<stack>

   聲明  stack< 類型 > sk(變量);  注意  這裏的類型  如果是char只能是單個字符 如果要存字符串要用string

  • sk.push();           向裏存  寫在括號裏
  • sk.pop();             出棧 把最上面的出棧(即所謂的先進後出  注意  這裏的不能賦值給別的變量 括號裏也不能寫東西
  • data = sk.top();   取出棧頂的元素賦值給一個變量 (不出棧
  • size = sk.size();  棧裏元素的個數
  • sk.empty();         判定棧是否爲空

注意 要清空棧  沒有函數 要自己寫

while(!sk.empty())
{
    sk.pop();
}

2 隊列

   特點   先進先出  (類似於排隊買飯

  頭文件  #include<queue>

  聲明  queue< 類型 > q(變量);

  • q.push();             向裏存  寫在括號裏
  • q.pop();               出隊列 把隊首的出隊列(即所謂的先進先出  注意  這裏的不能賦值給別的變量 括號裏也不能寫東西
  • data = q.front();   獲得隊列首的元素賦值給一個變量 (不出隊列
  • q.back();              獲得隊尾的值 同q.front();
  • size = q.size();     隊列裏元素的個數
  • q.empty();            判定隊列是否爲空
  • q.clear();              清空隊列

3 雙端隊列

    特點  兩端都可以進出

   頭文件  #include<deque>

   聲明  deque< 類型 > dq(變量);

  • dq.push_front();           向雙端隊列首存  寫在括號裏
  • dq.push_back();           向雙端隊列尾存  寫在括號裏
  • dq.pop_front();             將雙端隊列的隊首元素出雙端隊列 
  • dq.pop_back();             將雙端隊列的隊尾元素出雙端隊列 
  • data = dq.front();          獲得雙端隊列首的元素賦值給一個變量 (不出雙端隊列
  • q.back();                       獲得雙端隊列尾的值 同q.front();
  • dq.empty();                  判定雙端隊列是否爲空
  • dq.clear();                      清空雙端隊列

4 優先隊列(暫時不會。。大佬的...

   特點 自動按升降序排序

    頭文件 #include<queue>

    priority_queue < 類型 > q;                                                      默認大小排序從大到小   

    priority_queue < 類型 ,vector <類型>, greater<類型> > q;   默認大小排序從小到大

    priority_queue < 類型 ,vector <類型>, less<類型> > q;        默認大小排序  從大到小

  • q.push();           向裏存  寫在括號裏
  • q.pop();             出隊列  隊首
  • data = q.top();   取出隊首的元素賦值給一個變量 (不出棧
  • size = q.size();  隊列裏元素的個數
  • q.empty();         判定隊列是否爲空
  • 可以用cmp來替代greater less 
    struct cmp{
        bool operator () (const int a,const int b ) const {
        //這裏和正常的cmp寫法一樣
        }
    };

     

5 unique(     ,     )    去重       lower_bound()   upper_bound()

emmmm 沒事看看

6 set  

    set <  類型 > q; 集合   自帶排序   迭代器  

     q.insert();  插入

     q.erase();  插入  

      q.lower_bound();

     迭代器   set  <  類型  >  :: iterator it;

     it = q.begain();

     for(it = q.begain() ; it ! = q.end() ; it++)

       *it

   兩個查詢

   it=q.find();  返回迭代器

    q.count();  返回0或1

  運算符重載

6 map 

     map< 類型,類型 > m;

                鍵     值   

     迭代器   map  <  類型  >  :: iterator it;

     it = q.begain();

     注意這裏的類型可以是結構體不過要重新定義他的排序方式  默認類型(例如int long 之類的是定義過的  ) 如果不定義(或者少定義會使得排序和查詢過程中的錯誤)的話結果就不對 一定要每個都說明  !!!! 

我是看這個dalao學的...

struct QWE
{
    LL a,b,c;
    bool operator<(const QWE& tmp) const
    {
        if(a==tmp.a&&b==tmp.b)
            return c<tmp.c;
        if(a==tmp.a)
            return b<tmp.b;
        return a<tmp.a;
    }
}

    反向迭代器  map<   >   :: revecs_ iterator it;

     for(it = q.rbegain() ; it ! = q.rend() ; it++)

7 strstr() strchr()

做題時候偶然發現的函數在ctring中(string.h中好像也有) 功能是查找第一個串中的第二個串,第二個功能是在第一個串中查找單個字符

//ps 爲什麼要寫呢 因爲好像這個函數的速度比kmp和BM快說是o(1) 所以僅供參考

8 說一下c++的string

類似於char [] 的字符串數組 但是可以直接賦值(相當於給字符串定義了一個系統規則使它變得和int之類的類似)

但是隻能用cin cout輸入輸出//可能是我暫時還沒找到用scanf 和 printf輸入輸出的方法

題取子串的函數是:substr(),形式如下:
s.substr(); //返回s的全部內容
s.substr(11); //從索引11往後的子串
s.substr(5,6); //從索引5開始6個字符
把兩個字符串結合起來的函數是+。

9 sort();

太菜了  現在才知道sort也能用來排vector

舉個例子
vector<int>q;
q.push_back(1);
q.push_back(3);
q.push_back(-2);
sort(q.begin(),q.end());

10 lower_bound()

和sort一樣是三個參數除了最後一個是寫你要查的什麼其他兩個和sort一樣  返回第一個大於或等於第三個參數的地址

11 next_permutation();

這個函數用來求下一個排列

#include<algorithm>
int p[10];
int main()
{
   next_permutation(p,p+n);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章