ACM常用的C++ && STL


內容

  1. c++輸入輸出
  2. c++ string
  3. vector:不定長數組
  4. map:映射
  5. queue:隊列
  6. sort:排序
  7. priority_queue:優先隊列

c++輸入輸出

 1 #include <iostream>    //c++輸入輸出的頭文件
 2 using namespace std;   //名稱空間, 不懂死記硬背
 3 
 4 int main(){
 5     int a;  //或是long long a; double a; char a[10]; 等等,總之不需要像c語言一樣要占位符
 6     cin >> a;  //輸入
 7     cout << a; //輸出
 8 
 9     cout << "abcdefg";  //輸出字符串
10     cout << endl; //換行
11     cout << "abcdefg" << endl; //合並cout,效果和上面兩個語句一樣
12 
13     int b;
14     cin >> a >> b;  //合並cin,效果和 cin >> a;  cin >> b; 一樣
15     cout << "abcdefg\n"; //效果和上一個語句一樣
16     cout << 'a'; //輸出字母a,而不是ASCII碼,這個和c語言有點不一樣
17     
18     return 0;
19 }

在這里我們可以看到,用c++輸入輸出能夠極大方面減少錯誤率,而且支持的對象也非常多(把上面的int a改成double a / long long a等等都是可以的),c語言的輸入輸出實在是有點麻煩。不過c語言的輸入輸出優點也是有的:格式化輸出 printf(); 更方便,而且效率更高(比c++的輸入輸出要快)。所以,一般情況可以直接用c++的輸入輸出,而對於數據輸入量大的題目最好改成c語言的輸入輸出。另外,如果想在c++中用c的頭文件,只需要把 #include <xxx.h> 改成 #include <cxxx> 。舉個例子,c語言中的輸入輸出頭文件是 #include <stdio.h>,那么在c++中就是 #include <cstdio>。

c++ string

string類:這個就是升級版的 char s[] 。顧名思義,就是字符串,但是這個字符串比 char s[] 方便很多。我們先來看看string的頭文件和名稱空間:

1 #include <string>
2 using namespace std;

是不是又看到了 using namespace std; ,這個幾乎是每個頭文件的通用名稱空間,其他的c++頭文件默認也是這個名稱空間,而且還可以這樣寫:

1 #include <iostream>
2 #include <string>
3 using namespace std;

以后寫完一堆頭文件后直接在末尾加一句 using namespace std; 就行了。

string的用法:

 1 #include <iostream>    
 2 #include <cstdio>
 3 #include <string>
 4 using namespace std;   
 5 
 6 int main(){
 7     string s;
 8     cin >> s; //輸入
 9     cout << s; //輸出
10 
11     string s2;
12     s2 = s;   //把s里面的內容復制到s2里面
13 
14     string s3;
15     s3 = s + s2; //拼接s和s2然后復制到s3里面
16     s = s + s2; //把s2拼接到s末尾
17 
18     int len = s.length(); //計算s的長度, 然后賦值到len,功能和strlen()一樣,都不算'\0'
19 
20     if(s[0] != 'a') s[0] = 'a'; //可以直接像char s[]一樣訪問和修改
21 
22     int cnt = 0;
23     if(s == s2) cnt++;  //可以直接比較s和s2是否相等
24 
25     return 0;
26 }

vector:不定長數組

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <vector>     //相關頭文件
 4 using namespace std;
 5 
 6 int main(){
 7     //vector(不定長數組)用法介紹
 8     vector<int> G;     //創建vector
 9     G.push_back(5);    //加入元素5, 類似於棧
10     G.push_back(3);    //加入元素3
11     G.push_back(7);    //加入元素7
12     //這時vector里面有元素: 5, 3, 7
13 
14     //訪問
15     int a;
16     a = G[0];   //a被賦值為vector里面的第一個元素,即a = 5
17     a = G[1];   //a被賦值為vector里面的第二個元素,即a = 3
18 
19     //獲得vector的大小: G.size()    //這里是遍歷vector里面的元素
20     for(int i = 0; i < G.size(); i++){
21         printf("%d\n", G[i]);
22         //這里G.size() == 3, 所以輸出G[0], G[1], G[2]
23     }
24     printf("\n");
25 
26     G.clear(); //清空不定長數組G, 相當於不定長數組大小設為0
27 
28     //高級用法: vector數組
29     vector<int> g[3];
30     //這里創建了3個vector, 其中分別是g[0], g[1], g[2]
31     g[1].push_back(4);   //向g[1]這個vector加入元素4
32     g[1].push_back(1);   //向g[1]這個vector加入元素1
33 
34     //訪問
35     a = g[1][0];   //a被賦值為g[1]里面的第一個元素,即a = 4
36     a = g[1][1];   //a被賦值為g[1]里面的第二個元素,即a = 1
37 
38     for(int i = 0; i < g[1].size(); i++){
39         printf("%d\n", g[1][i]);
40         //這里g[1].size() == 2, 所以輸出g[1][0], g[1][1]
41     }
42 
43     return 0;
44 }

map:映射

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <map>
 4 #include <string>
 5 using namespace std;
 6 
 7 int main(){
 8     //map用法介紹
 9     map<string, int> mp;     //創建一個map: 從string到1的映射
10     mp["abc"] = 1;   //建立從字符串"abc"到整數1的映射
11     string s = "efg";   //創建一個string
12     mp[s] = 5;       //建立從字符串"efg"到整數5的映射
13 
14     //訪問
15     int a;
16     a = mp["abc"];    //這時mp["abc"]的值為1, 也就是a = 1
17     cout << a << endl;
18     a = mp[s];        //這時mp[s]的值為5, 也就是a = 5
19     cout << a << endl;
20 
21     //使用char數組
22     char s2[5] = "gsd";
23     mp[s2] = 9;       //建立從字符串"gsd"到整數9的映射
24     cout << mp[s2] << endl;
25 
26     mp.clear();  //清空mp里面的元素, 相當於把所有映射都抹去
27 
28     //最后注意的是, 雖然map看起來很像hash, 但其內部實現不是hash, 而是一顆樹(紅黑樹)
29     //也就是說, 當進行訪問map的操作時, 時間復雜度為O(log m)(m為映射數量), 並不是O(1)
30 
31     return 0;
32 }

 

queue:隊列

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <queue>
 4 using namespace std;
 5 
 6 int main(){
 7     //queue基本用法
 8     queue<int> q;    //創建一個先進先出的隊列(也就是這個隊列只能在尾部加入元素, 頭部取出元素, 這個是關鍵)
 9     q.push(1);    //加入元素1
10     q.push(2);    //加入元素2
11     q.push(3);    //加入元素3
12     //這時隊列是: 1, 2, 3
13 
14     //訪問
15     int a;
16     a = q.front();  //這時q.front()的值為1, 所以a = 1, 注意這里只是讀取隊列首元素, 並沒有彈出元素
17     cout << a << endl;
18     a = q.front();
19     cout << a << endl;
20 
21     //彈出
22     q.pop();    //彈出隊列的首元素, 也就是變成2, 3
23     a = q.front();
24     cout << a << endl;
25 
26     //判斷隊列是否為空
27     q.pop();    //彈出隊列的首元素, 也就是變成3
28     q.pop();    //彈出隊列的首元素, 此時隊列為空
29     if(q.empty()) cout << "Yes\n";      //如果隊列為空, 則q.empty()為真, 則輸出"Yes"
30     if(q.size() == 0) cout << "Yes\n";  //如果隊列大小為0, 則輸出"Yes"
31 
32     return 0;
33 }

sort:排序

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 //先從主函數看
 6 
 7 struct node{
 8     int first, second;
 9 };
10 
11 bool cmp1(int x, int y){
12     return x > y;    //從大到小排
13 }
14 
15 bool cmp2(int x, int y){
16     return x < y;    //從小到大排
17 }
18 
19 bool cmp_node(node x, node y){
20     if(x.first == y.first) return x.second < y.second;
21     else return x.first < y.first;
22     //這里的意思: 優先對結構體的第一個值進行排序, 如果第一個值相等, 就按照第二個值進行排序
23 }
24 
25 int main(){
26     //sort的用法
27     int a[5] = {5,4,3,2,1};
28     sort(a, a+5);    //默認對數組a進行從小到大排序
29     for(int i = 0; i < 5; i++){
30         cout << a[i] << " ";
31     }
32     cout << endl;
33 
34     string s[3] = {"bcd", "abc", "a"};
35     sort(s, s+3);    //默認對字符串進行字典序排序
36     for(int i = 0; i < 3; i++){
37         cout << s[i] << endl;
38     }
39     cout << endl;
40 
41     //自定義比較級(比較函數):
42     sort(a, a+5, cmp1);  //按cmp1的比較級排序, 注意這里cmp1后面不能加()
43     for(int i = 0; i < 5; i++){
44         cout << a[i] << " ";
45     }
46     cout << endl;
47 
48     sort(a, a+5, cmp2);   //按cmp2的比較級排序
49     for(int i = 0; i < 5; i++){
50         cout << a[i] << " ";
51     }
52     cout << endl;
53 
54     cout << endl;
55     //對結構體進行排序
56     node G[3] = {{5,3}, {5, 2}, {1, 9}};
57     sort(G, G+3, cmp_node);   //按照cmp_node進行排序
58     for(int i = 0; i < 3; i++){
59         printf("G[%d]: %d %d\n", i, G[i].first, G[i].second);
60     }
61     cout << endl;
62 
63     return 0;
64 }

priority_queue:優先隊列

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <queue>
 4 #include <vector>
 5 using namespace std;
 6 //從主函數看起
 7 
 8 struct node{
 9     int first, second;
10 };
11 
12 struct cmp1{    //這里比較級是用結構體, 而不是函數
13     bool operator () (int a, int b){   //重載操作, 記住就行
14         return a > b;   
15         //小的優先在前面, 因為是用"堆"去實現的, 不清楚堆就直接記住和sort的cmp剛好相反
16     }
17 };
18 
19 struct cmp2{
20     bool operator () (node a, node b){
21         if(a.first == b.first) return b.second > b.second;
22         return a.first > b.first;
23     }
24 };
25 
26 int main(){
27     //priority_queue基本用法
28     priority_queue<int> q;  //創建一個優先隊列
29     q.push(1);    //加入元素1
30     q.push(3);    //加入元素3
31     q.push(2);    //加入元素2
32     
33     if(!q.empty()) printf("YES\n");    //q.empty():判斷優先隊列是否為空
34     
35     int a;
36     while(!q.empty()){
37         a = q.top();    //這里只是讀取隊列首元素, 並沒有彈出元素
38         printf("%d ", a);
39         q.pop();        //彈出首元素
40     }
41     printf("\n");
42     //運行上面程序,發現輸出為:3, 2, 1, 也就是說, 默認優先隊列默認從大到小排列
43     
44     priority_queue<int, vector<int>, less<int> > q_less;
45     //創建一個優先級為:從大到小, 排的優先隊列
46     
47     priority_queue<int, vector<int>, greater<int> > q_great;
48     //創建一個優先級為:從小到大, 排的優先隊列
49     
50     priority_queue<int, vector<int>, cmp1> q_cmp1;
51     //自定義比較級:cmp1
52     
53     priority_queue<node, vector<node>, cmp1> q_cmp1;
54     //自定義比較級:cmp2
55     return 0;
56 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM