俗話說:磨刀不誤砍柴工 不會c++仍然能夠作,可是效率低
C++保留了C的scanf和printf,增長了額外的cin與coutjava
例子ios
int a; scanf("%d",&a); printf("%d",a);
int a; cin>>a; cout<<a;
int a,b,c; cin>>a>>b>>c; cout<<a<<b<<c;
cout<<1; cout<<endl; cout<<2; cout<<3<<endl<<endl;
好處:c++
1.少寫了不少東西算法
2.連續輸入輸出變量數組
3.換行優雅less
注意:cin、cout比scanf、printf慢,有時候刷算法超時,可能由於使用了cin、cout 輸入輸出的數量(>1000)特別多,刷算法用cin,cout容易超時
STL是一些「容器」的集合,這些「容器」有list,vector,set,map等,STL也是算法和其餘一些組件的集合。函數
algorithm是對容器繼承的一些算法函數,輔助刷算法題學習
sort函數spa
概念:迭代器——理解爲指針.net
#include <iostream> #include <algorithm> using namespace std; int main() { int a[]={2,1,5,0,-1,5,9}; sort(a,a+7); for(int i=0;i<7;i++) cout<<a[i]<<" "; cout<<endl; system("pause"); return 0; }
概念:至關於char*的封裝,理解爲字符串
/**C中定義字符串以及打印*/ char *ch="asdkajbf"; for(int i=0;ch[i]!='\0';i++) cout<<*(ch+i); /**C++中*/ string s="ssadaffw"; cout<<s<<endl;
我想獲取一行字符串
hello world
C中:
scanf("%s",ch);//1.僅獲取一個單詞,空格結束 2.ch[100]得設置初始大小
C++中:
string s; getline(cin,s);//獲取一行數據 cout<<s;
+=對於字符串,字符有效,數字會轉爲asc碼
string s; s+="hello"; s+=" world"; s+='5'; s+=10;//10對應的asc碼是換行 int a=5;//想把a加入字符串 s+=(a+'0'); cout<<s;
string s="5418340"; sort(s.begin(),s.end()); cout<<s;
/**begin是頭迭代器,end是尾迭代器*/ string s="5418340"; s.erase(s.begin());//刪除第一個 s.erase(--s.end());//刪除最後一個 cout<<s;
/**begin是頭迭代器,end是尾迭代器*/ string s="5418340"; s=s.substr(1,3);//取418,取索引爲1,日後截斷3個 s=s.substr(1,-1);//索引爲1,截斷到最後 cout<<s;
1.for循環
string s="5418340"; for(int i=0;i<s.length();i++) cout<<s[i];
2.迭代器
for(string::iterator it=s.begin();it!=s.end();it++) cout<<*it;
3.迭代器化簡
for(auto it=s.begin();it!=s.end();it++) cout<<*it;
4.利用C++ 11新特性for循環
for(auto x:s) cout<<x;
概念:vector至關於數組,模板類型至關於存放的內容
1.vector構造
vector<int> v;//定義一個空vector vector<int> v2(4);//定義一個4個大小的vector,初始爲0 vector<int> v3(4,6);//定義一個4個大小的vector,初始爲6 vector<int> v{1,2,3,4,5};//定義一個vector,數字爲1,2,3,4,5 for(auto x:v3) cout<<x;
2.用at或者[]獲取元素
vector<int> v{1,2,3,4,5}; cout<<v[1];//取索引爲1的 cout<<v.at(2);//取索引爲2的
3.方法
vector<int> v; v.push_back(5); v.push_back(5); v.push_back(5); v.push_back(5); v.push_back(6); for(auto x:v) cout<<x;
v.resize(10);//不賦值默認爲0
v.erase(v.begin());//刪除第一個元素 v.erase(--v.end());//刪除最後一個元素
/**獲取第一個元素*/ cout<<v.front(); cout<<v[0]; cout<<*v.begin(); /**獲取最後一個元素*/ cout<<v.back(); cout<<v[v.size()-1];//size是獲取大小 cout<<*--v.end();
4.排序
第三個參數爲比較器,不寫默認爲less<int>()
vector<int> v{5,1,2,5,4,0,-1}; sort(v.begin(),v.end(),less<int>());//從小到大 sort(v.begin(),v.end(),greater<int>());//從大到小排序 for(auto x:v) cout<<x;
5.循環
vector<int> v{5,1,2,5,4,0,-1}; for(int i=0;i<v.size();i++) cout<<v[i];//for循環 cout<<endl; for(vector<int>::iterator it=v.begin();it!=v.end();it++) cout<<*it;//迭代器循環 cout<<endl; for(auto it=v.begin();it!=v.end();it++) cout<<*it;//迭代器簡化循環 cout<<endl; for(auto x:v) cout<<x;//c++11新特性
概念:棧
stack<int> s;
s.push(2); s.push(3); cout<<s.top()<<endl; s.pop(); cout<<s.top()<<endl; cout<<s.size()<<endl;
int itob(int decimal){ stack<int> s;int res=0; while(decimal!=0){ s.push(decimal%2); decimal/=2; } while(!s.empty()){ res=res*10+s.top(); s.pop(); } return res; }
輸入一行字符串,將字符串逆序打印
輸入:hello world my name is steve yu
輸出:yu steve is name my world hello
#include <iostream> #include <stack> #include <sstream> using namespace std; int main(){ string str; stack<string> s; getline(cin,str); stringstream ss; ss<<str; while(ss>>str) s.push(str); while(!s.empty()){ cout<<s.top(); s.pop(); if(s.size()!=0) cout<<" "; } return 0; }
方法1:
string s="1234"; int i; stringstream ss; ss<<s; ss>>i; cout<<i;
方法2:
string s="1234"; int i=stoi(s); cout<<i;
方法1:
int a=1234; string out; stringstream ss; ss<<a; ss>>out; cout<<out<<endl;
方法2:(c++ 11)
int a=1234; cout<<to_string(a)<<endl;
概念:隊列
queue<int> q;
q.push(5); q.push(6); cout<<q.front()<<endl; q.pop(); cout<<q.front()<<endl; cout<<q.size()<<endl;
概念:映射(map爲樹狀表,unorderedmap爲哈希表)
map<int,int> m;//有序的,樹狀結構(底層) m[6]=3; m[5]=8; m[4]=9; for(auto it=m.begin();it!=m.end();it++) cout<<it->first<<" "<<it->second<<endl; for(auto tmp:m){ cout<<tmp.first<<" "<<tmp.second<<endl; }
unordered_map<int,int> m;//無序的,哈希結構(底層) m[6]=3; m[5]=8; m[4]=9; for(auto it=m.begin();it!=m.end();it++) cout<<it->first<<" "<<it->second<<endl; for(auto tmp:m){ cout<<tmp.first<<" "<<tmp.second<<endl; }
bool cmp(pair<int,int> a,pair<int,int> b){ return a.first>b.first; } int main(){ unordered_map<int,int> m;//無序的,哈希結構(底層) m[6]=3; m[5]=8; m[4]=9; vector<pair<int,int>> v(m.begin(),m.end()); sort(v.begin(),v.end(),cmp); for(auto tmp:v){ cout<<tmp.first<<tmp.second<<endl; } return 0; }
概念:集合
set<int> s;//樹狀結構,有序 unordered_set<int> s2;//哈希結構,無序,快 s.insert(3); s.insert(4); s.insert(4); s.insert(4); cout<<s.size()<<endl; for(auto tmp:s) cout<<tmp<<" "; cout<<endl; for(auto it=s.begin();it!=s.end();it++) cout<<*it<<" "; cout<<endl;
概念:雙端隊列
deque<int> d; // 4 9 1 2 d.push_back(1); d.push_back(2); d.push_front(9); d.push_front(4); d.pop_back(); d.pop_front(); for(auto tmp:d) cout<<tmp<<endl; for(auto it=d.begin();it!=d.end();it++) cout<<*it<<endl;
sort(d.begin(),d.end(),greater<int>());
概念:雙向鏈表
list<int> li; li.push_back(6); li.push_front(5); li.emplace_front(9); li.emplace_back(10); li.insert(++li.begin(),2); for(auto tmp:li) cout<<tmp<<endl; for(auto it=li.begin();it!=li.end();it++) cout<<*it<<endl;
英文:
http://www.cplusplus.com/reference/stl/
中文:
http://c.biancheng.net/stl/map/