STL应用
数组排序
#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;
}
输出结果:-1 0 1 2 5 5 9
string
概念
相当于char*的封装,理解为字符串
获取一行字符串
hello world:
string s;
getline(cin,s);
cout<<s;
+=运算
string s;
s+="hello";
s+=" world";
s+="5";
cout<<s;
输出结果:hello world5
如果+数字会变为ASCII码
排序
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
string s="5418340";
sort(s.begin(),s.end());
cout<<s;
system("pause");
return 0;
}
输出结果:0134458
erase函数
string s="5418340";
s.erase(s.begin());
s.erase(--s.end());
cout<<s;
输出结果:41834
substr函数
string s="5418340";
s=s.substr(1,3);//从第一个开始,一共取三个
cout<<s;
输出结果:418
若为s=s.substr(5,100);
或s=s.substr(5,-1);//-1也为取到最后一位
输出结果:40
循环
#include<iostream>
using namespace std;
int main()
{
string s="5418340";
for(int i=0;i<s.length();i++)
{
cout<<s[i];
}
cout<<endl;
for(string::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it;
}
cout<<endl;
for(auto x:s)
cout<<x;
cout<<endl;
system("pause");
return 0;
}
输出结果:5418340 5418340
vector
相当于数组
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;//构造
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
{
cout<<*it;
}
system("pause");
return 0;
}
构造方法
vector<int>v;
vector<int>v(5);//容量为5
vector<int>v(5,1);//容量为5,存放数量为1,即5个1
vector<int>v{1,2,3,4,5};
获取元素
用[ ]或at
vector<int>v{1,2,3,4,5};
cout<<v[1];//2
cout<<v.at(2);//3
方法
push_back追加:v.push_back(5);//在最后加一个5
resize进行重置大小:v.resize(10);//不赋值默认为0
erase删除元素,复杂度为O(n):v.erase(v.begin());//删除第一个
font和back获取第一个和最后一个:cout<<v.font();
注意
v.back();=v[v.size()-1];=cout<<*--v.end();
排序
vector<int>v{5,1,2,5,4,0,-1};
sort(v.begin(),v.end());
for(auto x:v)
cout<<x;
sort(v.begin(),v.end(),greater<int>());//从大到小
for(auto x:v)
cout<<x;
循环
for(int i=0;i<v.size();i++)
cout<<v[i];
for(vector<int>::iterator it=v.begin();it!=v.end();it++)
cout<<*it;
for(auto it=v.begin();it!=v.end();it++)
cout<<*it;
for(auto x:v)
cout<<x;
stack
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> s;
s.push(2);
s.push(3);
cout<<s.top()<<endl;
s.pop();
cout<<s.top()<<endl;
return 0;
}
输出结果:3 2
方法
push();//入栈一个元素
pop();//出栈一个元素(无返回值)
top();//取栈顶元素
size();//查看元素个数
进制转换
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;
}
int main()
{
int decimal=20;
cout<<itob(decimal);
return 0;
}
输出结果:10100
逆序单词
要求:输入一行字符串,将字符串逆序打印
#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;
}
输入:hello world ni hao
输出结果:hao ni world hello
字符串转数字(方法一)
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
string s="1234";
int i;
stringstream ss;
ss<<s;
ss>>i;
cout<<i;
return 0;
}
输出结果:1234
字符串转数字(方法二)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s="1234";
int i=stoi(s);
cout<<i;
return 0;
}
字符串转数字(方法三)
for循环
数字转字符串(方法一)
int i=1234;
string s;
stringstream ss;
ss<<i;
ss>>s;
cout<<s<<endl;
数字转字符串(方法二)
int a=1234;
cout<<to-string(a)<<endl;
数字转字符串(方法三)
for循环
queue队列
先进先出
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int>q;
q.push(5);
q.push(6);
cout<<q.front()<<endl;
q.pop();
cout<<q.front()<<endl;
return 0;
}
输出结果:5 6
map
概念:映射(map为树状表(有顺序),unorderedmap为哈希表)
#include<iostream>
#include<map>
#include<unordered_map>
using namespace std;
int main()
{
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;
return 0;
}
输出结果:4 9
5 8
6 3
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(),tmp);
for(auto tmp:v)
{
cout<<tmp.first<<tmp.second<<endl;
}
return 0;
}
输出结果:6 3
5 8
4 9
set
不允许有重复元素,有序
unordered_set(无序,快)
#include<iostream>
#include<set>
#include<unordered_set>
using namespace std;
int main()
{
set<int>s;
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;
return 0;
}
输出结果:2
3 4
3 4
deque
双端队列
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int>d;
d.push_back(1);
d.push_back(2);
d.push_front(9);
d.push_front(4);
for(auto tmp:d)
cout<<tmp<<" ";
cout<<endl;
d.pop_back();
d.pop_front();
for(auto tmp:d)
cout<<tmp<<endl;
return 0;
}
输出结果:4 9 1 2
9 1
排序
sort(d.begin(),d.end(),greater<int>());
list
双向链表
#include<iostream>
#include<list>
using namespace std;
int main()
{
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;
return 0;
}
输出结果:9
2
5
6
10
push和emplace区别(back)
push:要先构造临时对象,再将这个对象拷贝到容器末尾
emplace:直接在容器末尾构造对象