1. 基本框架
#include<bits/stdc++.h>
using namespace std;
int main(){
return 0;
}
2. 輸入輸出
No. | 類型 | 變量 | 輸出 | 輸入 |
---|---|---|---|---|
1 | 整型 | int n = 0; |
printf("%d\n",n); |
scanf("%d",&n); |
2 | 單精度浮點(diǎn)型 | float f = 0; |
printf("%f\n",f); |
scanf("%f",&f); |
3 | 字符串 | string s; |
cout << s << "\n"; |
cin >>s; |
4 | 字符 | char c; |
printf("%c",c); |
scanf("%c",&c) |
5 | 長(zhǎng)整型 | long long l; |
printf("%ldd",l); |
printf("%lld",&l); |
變量名只能英文字母加下劃線
小數(shù)精確度處理:%.精確度f(wàn)
整數(shù)除法說(shuō)明
整數(shù)除以整數(shù)還是整數(shù)终蒂,如果結(jié)果需要是小數(shù)句葵,要乘以1.0
。例如:
3/2
結(jié)果為1
,1.0*3/2
結(jié)果為1.5
争剿。
3. 字符串
- 字符串變量
string s;
- 獲取字符串長(zhǎng)度
s.size()
- 獲取字符串
i
位置字符s[i]
- 遍歷字符串
for(int i=0;i<s.size();++i){
printf("%c",s[i]);
}
- 從
i
截取長(zhǎng)度為len
字符串s.substr(i,len);
- 從
i
截取到字符串結(jié)束s.substr(i);
- 字符串字典序排序
sort(s.begin(),s.end());
- 在字符串后添加
n
個(gè)字符c
s.append(n,c);
- 字符串連接
+
,str3 = str1+str2
- 構(gòu)建一個(gè)
n
個(gè)字符c
組成的字符串string(n,c)
4. 數(shù)組
- 定長(zhǎng)數(shù)組:數(shù)組長(zhǎng)度已知庸诱,并且數(shù)組大小不能改變
- 變長(zhǎng)數(shù)組:數(shù)組長(zhǎng)度未知,并且數(shù)組大小可以改變
4.1 一維數(shù)組
No. | 操作 | 定長(zhǎng)數(shù)組 | 變長(zhǎng)數(shù)組 |
---|---|---|---|
1 | 定義數(shù)組 | int nums[n]; |
vector<int> nums; |
2 | 訪問(wèn)下標(biāo)i 元素 |
nums[i] |
nums[i] |
3 | 存放數(shù)據(jù) | nums[i] |
nums.push_back(數(shù)據(jù)) |
4 | 數(shù)據(jù)數(shù)量 | n |
nums.size() |
- 遍歷向量
for(int i=0;i<nums.size();++i){ printf("%d\n",nums[i]); }
4.2 二維數(shù)組
No. | 操作 | 定長(zhǎng)數(shù)組 | 變長(zhǎng)數(shù)組 |
---|---|---|---|
1 | 定義數(shù)組 | int table[n][m]; |
vector<vector<int> > table; |
2 | 行數(shù) | n |
table.size() |
3 | 列數(shù) | m |
table[i].size() |
4 | 獲取第i 行第j 列數(shù)據(jù) |
table[i][j] |
table[i][j] |
- 向量存儲(chǔ)數(shù)據(jù)
vector<vector<int> > table; vector<int> row1; row1.push_back(1); row1.push_back(3); row1.push_back(4); row1.push_back(5); row1.push_back(6); vector<int> row2; row2.push_back(2); row2.push_back(7); row2.push_back(10); vector<int> row3; row3.push_back(8); row3.push_back(9); table.push_back(row1); table.push_back(row2); table.push_back(row3);
- 向量遍歷
for(int i=0;i<table.size();++i){ for(int j=0;j<table[i].size();++j){ printf("%d ",table[i][j]); } printf("\n"); }
5. 排序
- 排序函數(shù)
sort(開(kāi)始位置,結(jié)束位置)
- 按照
cmp
方式排序sort(開(kāi)始位置,結(jié)束位置,cmp)
sort()
默認(rèn)以字典序排列字符粗卜,以升序排列數(shù)字屋确。
- 按照字典逆序排列字符串
#include <bits/stdc++.h>
using namespace std;
bool cmp(char a,char b) {
return a > b;// 正確的順序
}
int main() {
string s; // s[i]
cin >> s;
sort(s.begin(),s.end(),cmp);
cout << s;
return 0;
}
- 按照降序排列數(shù)列
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a > b;// 正確的順序
}
int main() {
int n = 0;
scanf("%d",&n);
int nums[n];
for(int i=0;i<n;++i){
scanf("%d",&nums[i]);
}
sort(nums,nums+n,cmp);
for(int i=0;i<n;++i){
printf("%d ",nums[i]);
}
return 0;
}
6. 結(jié)構(gòu)體
把多個(gè)變量綁到一起的一個(gè)類型,可以把結(jié)構(gòu)體看成一個(gè)多個(gè)變量組成包。
struct 結(jié)構(gòu)體{
變量...
};
例如:
定義結(jié)構(gòu)體
struct UserInfo{
string name;
int age;
bool sex;
};
使用
UserInfo zhangsan;
zhangsan.name = "張三";
zhangsan.age = 31;
zhangsan.sex = true;
結(jié)構(gòu)體數(shù)組
UserInfo users[n];
users[i].name
users[i].age
users[i].sex
7. 查找
- 排序函數(shù)
find(開(kāi)始位置,結(jié)束位置,查找值)
如果找到了攻臀,返回查找值位置焕数,反之,返回結(jié)束位置刨啸。
8. 集合set
set<類型> 集合名
插入數(shù)據(jù)集合名.insert(數(shù)據(jù));
刪除數(shù)據(jù)集合名.erase(數(shù)據(jù));
set
里面沒(méi)有重復(fù)的值堡赔,不能使用[下標(biāo)]
訪問(wèn)。
集合里面存放數(shù)據(jù)數(shù)目集合名.size()
set<string> resset;
resset.insert("00");
resset.insert("10");
resset.insert("11");
resset.insert("01");
resset.insert("00");
resset.insert("01");
resset.insert("00");
resset.insert("00");
resset.insert("01");
resset.insert("00");
resset.insert("01");
// 集合不能使用resset[0];
for(string s:resset){
cout << s << '\n';
}
數(shù)據(jù)不允許重復(fù)设联,使用集合set<>
9. 基于范圍for
循環(huán)
int nums[4];
nums[0] = 1;
nums[1] = 2;
nums[2] = 3;
nums[3] = 4;
// 基于下標(biāo)的for循環(huán)
for(int i=0;i<4;++i){
printf("%d\n",nums[i]);
}
// 基于范圍的for循環(huán)
for(int n:nums){
// n相當(dāng)于nums[i]
printf("%d\n",n);
}
10. 指針
指針是用來(lái)存放變量的地址善已。使用類型 *
定義指針,
*指針變量
使用指針离例。
如果指針類型是結(jié)構(gòu)體换团,使用->
訪問(wèn)結(jié)構(gòu)體的變量。
#include <bits/stdc++.h>
using namespace std;
int main() {
int a = 0;
printf("%d\n",a);
int *p = &a;
*p = 10;
printf("%d\n",a);
}
11. 鏈表
數(shù)組類型 數(shù)組名[n]
#include <bits/stdc++.h>
using namespace std;
// 鏈表節(jié)點(diǎn) = 數(shù)據(jù) + 索引(指針)
struct Node{
int data;
Node *p;
};
// 10 7 5 3 2 1
int main() {
// 構(gòu)造鏈表
Node head; // 頭節(jié)點(diǎn)(鏈表的首節(jié)點(diǎn))
head.data = 10;
Node n1;
n1.data = 7;
head.p = &n1;
Node n2;
n2.data = 5;
n1.p = &n2;
Node n3;
n3.data = 3;
n2.p = &n3;
Node n4;
n4.data = 2;
n3.p = &n4;
Node n5;
n5.data = 1;
n4.p = &n5;
n5.p = NULL; // n5后面沒(méi)有節(jié)點(diǎn)了NULL宫蛆。
// 遍歷鏈表
Node* pNode = &root;
while(pNode != NULL){
printf("%d ",pNode->data);
pNode = pNode->p;
}
}
棧
先進(jìn)先出LIFO
使用vector<>
模擬棧艘包。
vector<char> test;
test.push_back('/');
test.push_back('a');
test.push_back('b');
test.push_back('c');
test.pop_back();
test.push_back('d');
test.pop_back();
test.pop_back();
for(int i=0;i<test.size();++i){
cout << test[i] << "\n";
}
棧的主要用途是,解決括弧匹配問(wèn)題耀盗。
#include <bits/stdc++.h>
using namespace std;
bool check(string s){
vector<char> stack;
for(int i=0;i<s.size();++i){
if(s[i] == '['){
stack.push_back('[');
}else if(s[i] == ']'){
if(stack.empty()){// 如果前面沒(méi)有做左括號(hào)想虎,不匹配
return false;
}
stack.pop_back();
}
}
return stack.empty();
}
int main(){
string s = "[[[]]][][][][][][][]";
printf("%d\n",check(s));
return 0;
}
特殊函數(shù)
累加函數(shù)accumulate(first,last,init)
,累加序列[first,last)
區(qū)間中的數(shù)據(jù)叛拷,init
是累加初始值
樹(shù)
struct Node{// 雙親孩子表示法
vector<int> children;
};
void DFS(int root,Node* nodes){// 深度優(yōu)先遍歷
stack<int> s;
s.push(root);
while(!s.empty()){
int now = s.top();
s.pop();
printf("%d ",now); // 出棧訪問(wèn)
vector<int> children = nodes[now].children;
for(int i=children.size()-1;i>=0;--i){
int post = children[i];
s.push(post);
}
}
}
void BFS(int root,Node* nodes){// 廣度優(yōu)先遍歷
queue<int> s;
s.push(root);
printf("%d ",root); // 入隊(duì)訪問(wèn)
while(!s.empty()){
int now = s.front();
s.pop();
vector<int> children = nodes[now].children;
for(int i= 0;i<children.size();++i){
int post = children[i];
s.push(post);
printf("%d ",post); // 入隊(duì)訪問(wèn)
}
}
}
深度遍歷遞歸寫法
void DFS2(int root,Node* nodes){// 深度優(yōu)先遍歷
printf("%d ",root); // 出棧訪問(wèn)
vector<int> children = nodes[root].children;
for(int i= 0;i<children.size();++i){
int post = children[i];
DFS2(post,nodes);
}
}