- 加了using namespace std 起名时 容易和库函数冲突(prev, count, next, sort)
- 用printf和scanf输入输出比cout和cin要快
- 关于cin.get()
- cin.getline(char*,int) 和getline(cin,line)
- c++动态开辟内存
int* number=new int;
int* arr=new int[100];
int* carr=(int *)malloc(100*sizeof(int));
- c++struct
struct node{
int number;
node* next;
};
node* head;
struct node{
int number;
node* next;
node(int _number=0, node* _next=NULL){
number=_number;
next=_next;
}
};
int main(){
node a=node(0);
node* b=new node(1,&a);
}
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
- c标准库
**<cstring>** strlen()、strcmp()、strcpy()、memset()
char str[10];
memset(str,-1,sizeof(str)); //可以填0、-1和0x3f3f3f3f
**<cmath>** 三角函数、指数函数
**<cstdlib>** qsort()//C语言快排
rand() <ctime> srand(time(NULL))
malloc() free()
- c++标准库
**<vector>**
vector<int> list;
int a;
cin>>a;
list.push_back(a);
vector<int>::iterator p1;//迭代器
for(p1=list.begin();p1!=list.end();p1++){ //遍历
cout<<*p1<<endl;
}
vector 常见操作
list.size();//O(1)
list.clear();//O(n)
list.empty();//O(1)
list.begin();//O(1)
list.end();//O(1) 该元素实际在数组中不存在
list.erase(p1); //删除数组某个迭代器所在位置的数字O(n)
list.push_back(1);//O(1)
list.pop_back();//O(1)
vector<string> vec;
vector<string>::iterator iter;
string gpcode="SZ000001";
iter = find(vec.begin(), vec.end(), gpcode);
if(iter != vec.end()){}
int nRet = std::count(vStr.begin(), vStr.end(), "xiaochun");//判断vector中是否有 "xiaochun" 这个元素
//可以看成特殊的vector
//vector所有的操作,string基本都有,唯一的区别是size的复杂度
string str=“Hello”;
str.length(); str.size()//O(n)
str.insert(1,“aaa”);
str.insert(str.begin(),‘a’);
str.append(str2);
str.compare(str2);
str==str2; str+=str2; str+=‘a’;
```cpp
**<algorithm>**
int arr[]{2,3,1,5,4};
vector<int> arr1{2,3,1,5,4};
sort(arr,arr+5); //快排 O(nlogn)
sort(arr2.begin(),arr2.end());
bool cmpInt(int a, int b){
return a>b;
}
sort(arr2.begin(),arr2.end(),cmpInt); //降序排列
min(1,2); max(1,2);
min_element(arr.begin(),arr.end());
max_element(arr.begin(),arr.end());//O(n)
nth_element(arr.begin(),arr.begin()+n,arr.end());//O(n)
swap(arr[0],arr[1]);//O(1)
reverse(arr.begin(),arr.end())//O(n)
int newLength=unique(arr.begin(),arr.end()-arr.begin());//需要在sort之后使用
bool isExist=binary_search(arr.begin(),arr.end(),1);//O(logn)
int firstLoc=lower_bound(arr.begin(),arr.end(),2)-arr.begin();
int lastLoc=upper_bound(arr.begin(),arr.end(),2)-arr.begin(); //O(logn)
//其他标准库
**<stack>** **<queue>**
stack<int> sta; queue<int> que;
sta.push(1); que.push(1);
int topElement=sta.top(); int frontElement=que.front();
sta.pop(); que.pop();
sta.empty(); que.empty();
sta.size(); que.size();
priority_queue<int> que2; //<functional>配合使用
que2.push(1);
int minElement=que2.top();
que2.pop();
que2.empty();
que2.size();
//栈和队列的复杂度都为O(1) 优先队列的复杂度为O(logn)
**<set>**
set<int> st; multiset<int> mst;
st.insert(1); mst.insert(1);
st.find(1); mst.insert(1);
st.erase(1); mst.count(1);//2
//O(logn) 迭代器的++和--能够在O(logn)的时间里找到第一个比它大(小)的数
**<map>**
pair<int,int> origin;
origin=make_pair(0,0);
origin.first==origin.second;
origin.swap;//返回swap的pair
pair<string,int> id;
id=make_pair("somebody",110);
map<string,int> studentHeight;
studentHeight["小明"]=170;
studentHeight["小红"]=150;
studentHeight.insert(id);
studentHeight.erase("小明");
//O(logn)
//<unordered_set>和<unordered_map>这两种数据结构不允许按大小顺序遍历元素,但能O(1)地访问和添加一个元素 哈希
#include<bits/stdc++.h> //一键包含所有头文件 visual studio除外
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
- 细节
1s时限内能做的运算次数大约为1e8,根据复杂度来算是否会超时
g++在输出double时不能用%lf,要用%f
由数据范围反推算法复杂度以及算法内容