1.sort
头文件algorithm sort(地址1,地址2) 排序算法,对地址1到地址2-1的数据排序
比较函数 cmp 可自定义比较规则
sort(v.begin(),v.end(),cmp);
bool cmp(object a,object b){
return a.c>=b.c;//按照数据结构中c的大小排序,c大的排在前面,
return a.c>b.c||(a.c==b.c&&a.d>b.d);//若两个对象的c值相等,则比较d
}
内置函数:
sort(s.begin(),s.end(),[&](char a,char b){
return orders[a-'a']<orders[b-'a'];
});
在STL容器中,只有vector deque string 可以使用sort函数
//可以正常比较字符串,并且score值相同时按照字符串的升序排列(ASC码)
bool cmp(testee a,testee b){
return a.score>b.score||(a.score==b.score&&strcmp(a.num,b.num)<0);
}
//无法正常比较,暂不知道原因
bool cmp(testee a,testee b){
return a.score>b.score||(a.score==b.score&&a.num<b.num);
}
2.string
使用cin读取字符串,读到空格会断开。如果要读取一整行字符串,可以使用getline(cin,s)
头文件 string STL string C语言中用指针或者数组定义字符串,用指针打印
C++中直接用cout打印
获取一行字符串: cin和scanf遇到空格都会结束,获取一行字符,可以用getline(cin,字符串)
+= 可以连接字符串。如果连接的是整型数据,会读入asc码对应的数字
s.begin() 字符串第一个字符的地址
s.end()字符串最后一个字符后面的地址
删除第一个字符:s.erase(s.begin());
删除最后一个字符:s.erase(--s.begin());
s.substr(索引,长度) 返回取完之后的结果(索引从0开始)长度为-1时,切片取字符串,截断到最后
s.substr()//截取整个字符串
s.substr(5,7) //从5开始,截取7个字符。如果剩下的不足7个字符,截取到最后
s.substr(5) // 从5开始,截取到最后
字符串比较可以直接使用 > < =,也可以使用compare函数
int compare(const string &s) const; //与字符串s比较
int compare(const char *s) const; //与字符串s比较
字符串逆序:#include
reverse(a.begin(),a.end());
删除第一个字符:s.erase(s.begin())
使用单个字符构造字符串:string(1,c);
遍历字符串
1.s.length()for循环遍历
2.迭代器
string::iterator it=s.begin();it!=s.end();it++
auto it=s.begin();it!=s.end();it++
auto 不受类型限制
for(auto x:s)
cout<<x;
### 3.vector
```cpp
vector
1.vector<int> v; 定义一个空的vector
vector<int>v2(4); 定义大小为4的vector,元素都初始化为0
vector<int>v2(4,6); 定义大小为4的vector,元素都初始化为6
vector<int>v3{1,2,3,4,5};
vector<int>new(old); 使用vector初始化vector。
2.遍历:
for(auto x:v)
cout<<x;
for(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;
3.获取元素: 取索引为i的元素
v[i]
v.at(i)
4.建立n行m列的矩阵:
vector<vector<int>>matrix;
matrix.resize(n,vector<int>(m));
5.插入元素
v.insert(v.begin(),x);//在最前面插入新元素
v.insert(v.begin()+i,1);//在迭代器中下标为i的元素前插入新元素
v.insert(v.end(),x);//在向量末尾追加新元素
v.insert(v.end(),count,x);//在尾部插入count个x
6.方法
v.push_back(元素)
v.resize(长度)重置大小,不赋值,默认为0
v.erase(地址) 删除元素,复杂度为O(n)
v.erase(v.begin())删除第一个元素
v.erase(--v.end())删除最后一个元素
v.erase(v.begin()+i)删除第i个元素
v.size() 获取大小
取第一个元素:v.front() *v.begin() v[0]
取最后一个元素:v.back() *(--v.end()) v[v.size()-1]
accumulate(vec.begin() , vec.end() , 初始值) 可用来求容器内所有元素的和或者连接字符串。
7.求最大值最小值
min=*min_element(bloomDay.begin(),bloomDay.end());
max=*max_element(bloomDay.begin(),bloomDay.end());
8.iota(v.begin(),v.end(),0); 对vector进行批量递增赋值。最后一个参数是初始值
排序:第三个参数为比较器,不写默认为less
sort(v.begin(),v.end())从小到大排序 sort(v.begin(),v.end(),less<int>())
sort(v.begin(),v.end(),greater<int>()) 从大到小排序
4.stack
stack
0.不能用是s[i]获取元素
1.构造stack stack<int> s;
2.s.push(元素)
3.s.top()只能取,不弹出
4.s.pop()弹出栈顶元素,无返回值
5.s.size()获取大小
6.s.empty()判断是否为空
7.进制转换
int itob(int damical)
{
stack<int> s;
int res;
while(demical!=0)
{
res=res*10+s.top;
s.pop();
}
return res;
}
8.逆序单词 将一个句子中的单词逆序输出,单词中的字母正序输出
fun()
{
stack<string> s;
string str;
getline(cin,str);
stringstream ss; 输入输出流
ss<<str;
while(ss>>str)
{
s.push(str);
}
while(!s.empty())
{
cout<<s.top();
if(s.size()!=1) //s.size()=1时,栈中只有最后一个元素 保证最后没有多余的空格
cout<<" ";
s.pop();
}
}
9.字符串转数字
1)
fun()
{
string s="1234";
stringstream ss;
int i;
ss<<s;
ss>>i;
cout<<i;
}
2)
fun()
{
string s="1234";
int i=stoi(s);
cout<<i;
}
10.数字转字符串
1)
fun()
{
int a=1234;
string out;
stringstream ss;
ss<<a;
ss>>out;
}
2)
int a=1234;
to_string(a)
5.queue
queue
queue<int> q;
q.push();
q.pop();
q.size();
q.front();
6.map
map map的底层是树形结构,是有序的
first second first是索引,按索引排序
1.map<int,int> m;
m[6]=3;
m[5]=8;
m[4]=9;
for(auto it=m.begin();it!=m.end();it++) it是指针,temp是成员
cout<<it->first<<" "<<it->second<<endl;
for(auto temp:m)
cout<<temp.first<<" "<<temp.second<<endl;
for (auto& [_, c] : m) {
cout<<c;//second
}
4 9
5 8
6 3
2.unorder_map<int,int>m;与map的区别是:无序 是hash结构
按索引从大到小排序:
bool cmp(pair<int,int>a,pair<int,int>b)
{
return a.first>b.first;
}
fun()
{
unorder_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 temp:v)
cout<<temp.first<<" "<<temp.second<<endl;
}
6 3
5 8
4 9
3.map的成员是pair结构
4.查找map中是否有某个值:
m.count(x)==0 说明没有
m.find(x)==m.end() 说明没有
7.set
unordered_set比set的效率更高,unordered_map比map的效率更高。
set 集合 不允许有重复元素,树状结构,有序 unorder_set hash结构,但是快
set<int>s;
s.insert(3);
s.insert(4);
s.insert(4);
s.insert(4);
s.size() 2
for(auto temp:s)
cout<<temp<<endl;
for(auto it=s.begin();it!=s.end();it++)
cout<<*it<<endl
判断某个数字是否出现在set中:
set.find(x)==set.end() 说明set中没有数字x
集合中有两个元素,分别是3和4
其他方法:
begin() 返回set容器的第一个元素
end() 返回set容器的最后一个元素
clear() 删除set容器中的所有的元素
empty() 判断set容器是否为空
max_size() 返回set容器可能包含的元素最大个数
size() 返回当前set容器中的元素个数
rbegin 返回的值和end()相同
rend() 返回的值和rbegin()相同
find() 返回给定值值得定位器,如果没找到则返回end()
erase(iterator) 删除定位器iterator指向的值
erase(first,second) 删除定位器first和second之间的值
erase(key_value) 删除键值key_value的值
insert(first,second) 将定位器first到second之间的元素插入到set中,返回值是void.
insert(key_value) 将key_value插入到set中 ,返回值是pair<set<int>::iterator,bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示的key_value在set中的位置。
lower_bound(key_value) 返回第一个大于等于key_value的定位器
upper_bound(key_value) 返回最后一个大于等于key_value的定位器
unordered_set
.count(element):如果元素存在于容器中,则此函数返回1,否则返回0。
8.dequeue
deque 双端队列
deque<int>d;
d.push_back(1);
d.push_back(2);
d.push_front(9);
d.push_front(4);
for(auto temp:d)
cout<<temp<<" ";
4 9 1 2
d.pop_back();
d.pop_front();
sort(d.begin(),d.end(),greater<int>); 可以排序,从小到大排序
9.list
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); 插入位置用指针表示
//C语言中文网
//http://www.cplusplus.com/reference/stl/
//http://c.biancheng.net/stl/map/
化简分数:
哈希表(散列表)
cin.ignore(); 可以用来消除回车字符的影响