先說一下 一邊要用到算法的東西一般要加#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()
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 之類的是定義過的 ) 如果不定義(或者少定義會使得排序和查詢過程中的錯誤)的話結果就不對 一定要每個都說明 !!!!
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);
}