STL常見用法

一、選擇C++刷算法的理由

  • 1.C++速度快(C不是更快麼,java太慢了)
  • 2.C++有STL(什麼是STL)——使用很方便的類庫
  • 3.如何使用STL進行高效刷算法
  • 4.好處:刷算法,學習成本極低
  • 5.如何從C到C++(僅基礎語法到刷算法程度)
俗話說:磨刀不誤砍柴工
不會c++仍然能夠作,可是效率低

二、輸入輸出

C++保留了C的scanf和printf,增長了額外的cin與coutjava

例子ios

2.1.C程序中輸入輸出
int a;
scanf("%d",&a);
printf("%d",a);
2.2.C++輸入輸出
int a;
cin>>a;
cout<<a;
2.3.連續輸入輸出變量
int a,b,c;
cin>>a>>b>>c;
cout<<a<<b<<c;
2.4.優雅地換行
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(Standard Template Library)與algorithm頭文件

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;
}

四、STL——string(*)

概念:至關於char*的封裝,理解爲字符串

4.1.簡單使用
/**C中定義字符串以及打印*/
char *ch="asdkajbf";
for(int i=0;ch[i]!='\0';i++) cout<<*(ch+i);
/**C++中*/
string s="ssadaffw";
cout<<s<<endl;
4.2.獲取一行字符串

我想獲取一行字符串

hello world

C中:

scanf("%s",ch);//1.僅獲取一個單詞,空格結束 2.ch[100]得設置初始大小

C++中:

string s;
getline(cin,s);//獲取一行數據
cout<<s;
4.3.+=運算符

+=對於字符串,字符有效,數字會轉爲asc碼

string s;
s+="hello";
s+=" world";
s+='5';
s+=10;//10對應的asc碼是換行
int a=5;//想把a加入字符串
s+=(a+'0');
cout<<s;
4.4.排序(使用algorithm)
string s="5418340";
sort(s.begin(),s.end());
cout<<s;
4.5.erase函數
/**begin是頭迭代器,end是尾迭代器*/
string s="5418340";
s.erase(s.begin());//刪除第一個
s.erase(--s.end());//刪除最後一個
cout<<s;
4.6.substr函數
/**begin是頭迭代器,end是尾迭代器*/
string s="5418340";
s=s.substr(1,3);//取418,取索引爲1,日後截斷3個
s=s.substr(1,-1);//索引爲1,截斷到最後
cout<<s;
4.7.循環(3種)

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;

五、STL——vector(*)

概念: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.方法

  • push_back追加內容
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;
  • resize進行重置大小
v.resize(10);//不賦值默認爲0
  • erase刪除元素,複雜度爲O(n)
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新特性

六、STL——stack(*)

概念:棧

  • 構造
stack<int> s;
  • push、pop、size、empty
  • push 入棧一個元素
  • pop 出棧一個元素,pop無返回值
  • top 取棧頂元素
  • size 查看元素個數
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;
}
  • 逆序單詞(拓展sstream,stoi,itoa)

輸入一行字符串,將字符串逆序打印

輸入: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;

七、STL——queue

概念:隊列

  • 構造
queue<int> q;
  • push、back
q.push(5);
q.push(6);
cout<<q.front()<<endl;
q.pop();
cout<<q.front()<<endl;
cout<<q.size()<<endl;

八、STL——map(unordered_map pair)

概念:映射(map爲樹狀表,unorderedmap爲哈希表)

  • map
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
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;
}
  • pair的用法(map轉成vector進行排序)
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(unordered_set)

概念:集合

  • 應用計數、去重
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;

十、STL——deque

概念:雙端隊列

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>());

十一、STL——list

概念:雙向鏈表

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;

12.文檔

英文:

http://www.cplusplus.com/reference/stl/

中文:

http://c.biancheng.net/stl/map/
相關文章
相關標籤/搜索