Learn C++ With Object Oriented
今天 你面向对象了吗?
咱就是说 也想感受感受c++的魔力
learn from scratch
do while语句
1 2 3 4 5
| do { statement(s); }while( condition );
|
在循环尾部检查条件 至少执行一次循环
switch语句
1 2 3 4 5 6 7 8 9 10 11
| switch(a){ case 1: break; case 2: break; default: break; }
|
不能直接用于string,可用map将string对应于int型再用switch
vector容器
能够存放任意类型的动态数组 线性有序
1 2 3 4 5 6 7 8 9
| #include<vector>
vector<elem_type> obj; obj.size() obj.empty() obj.push_back(elem) obj.pop_back() obj.clear() obj.insert(obj.begin(), x)
|
stack
栈 先进后出
1 2 3 4 5 6 7 8 9
| #include<stack>
stack<int> s; int x; s.push(x); s.top(); s.pop(); s.size(); s.empty();
|
unordered_map
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include<unordered_map>
unordered_map<char, int> myMap;
myMap['a'] = 1; myMap.insert( { {'b', 2}, {'c', 3} } );
myMap['a'] = 0;
myMap.erase('a'); myMap.erase(myMap.begin());
map.count('a')
myMap.clear(); myMap.empty(); myMap.size();
|
排序算法
快速选择排序
任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止 。
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| #include<iostream>
using namespace std;
const int N = 100010;
int n; int q[N];
void quick_sort(int q[], int l, int r) { if(l >= r) return; int i=l-1, j=r+1; int x = q[(l+r)/2]; while(i < j) { do i++; while(q[i] < x); do j--; while(q[j] > x); if(i < j) swap(q[i], q[j]); } quick_sort(q, l, j); quick_sort(q, j+1, r); }
int main(){ scanf("%d ", &n); for(int i; i < n; i ++) scanf("%d", &q[i]); quick_sort(q, 0, n-1); for(int i; i < n; i ++) printf("%d ", q[i]); return 0; }
|
归并排序
将两个有序数组合并
- 确定分界点 mid = (l + r) / 2
- 递归排序左右部分
- 合并
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include<iostream>
using namespace std;
const int N = 100010;
int q[N], t[N]; int n;
void merge_sort(int q[], int l, int r) { if(l >= r) return ; int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r); int i = l, j = mid + 1, k = 0; while(i <= mid && j <= r) { if(q[i] <= q[j]) t[k++] = q[i++]; else t[k++] = q[j++]; } while(i <= mid) t[k++] = q[i++]; while(j <= r) t[k++] = q[j++]; for(i = l, k = 0; i <= r; i ++, k ++) q[i] = t[k];
return ; }
int main() { scanf("%d", &n); for(int i = 0; i < n; i ++) scanf("%d", &q[i]);
merge_sort(q, 0, n-1); for(int i = 0; i < n; i++) printf("%d ", q[i]); return 0; }
|
整数二分法
code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| int bsearch_1(int l, int r) { while(l<r) { int mid=l+r>>1; if(check(mid)) r = mid; else l = mid + 1; } return l; }
int bsearch_2(int l,int r){ while(l<r) { int mid = l+r+1>>1; if(check(mid)) l = mid; else r = mid - 1; } return 1; }
|