STL库的整理
Whiteying
2018-12-18 20:44:48
# 成双pair
pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下:
```cpp
std::pair<int, string> a;
```
表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。
```cpp
std::pair<string, string> a("James", "Joy");
```
也可以像上面一样在定义的时候直接对其初始化。
由于pair类型的使用比较繁琐,因为如果要定义多个形同的pair类型的时候,可以时候typedef简化声明:
```cpp
typedef std::pair<string, string> author;
author pro("May", "Lily");
author joye("James", "Joyce");
```
Pair对象的操作
对于pair类,由于它只有两个元素,分别名为first和second,因此直接使用普通的点操作符即可访问其成员
```cpp
std::pair<string, string> a("Lily", "Poly");
std::string name;
name = pair.second;
```
生成新的pair对象
可以使用make_pair对已存在的两个数据构造一个新的pair类型:
```cpp
int a = 8;
std::string m = "James";
std::pair<int, string> newone;
newone = make_pair(a, m);
```
pair中也可套pair,让它包含多个数据值。
```cpp
std::pair< int , std::pair < int , int > > a[10];
```
```cpp
std::cin>>a[0].first;
std::cin>>a[0].second.first;
std::cin>>a[0].second.second;
std::cout<<a[0].first<<std::endl;
std::cout<<a[0].second.first<<std::endl;
std::cout<<a[0].second.second<<std::endl;
```
也可对pair进行sort排序。
如:
```cpp
#include<iostream>
#include<string>
#include<algorithm>
const int MAXN =1005;
std::pair<int,int>a[MAXN];
bool cmp1(std::pair<int,int>b,std::pair<int,int>c)
{
return b.first>c.first;
}
bool cmp2(std::pair<int,int>b,std::pair<int,int>c)
{
return b.second>c.second;
}
int main()
{
int n;
std::cin>>n;
for(int i=1;i<=n;i++)
std::cin>>a[i].first>>a[i].second;
std::sort(a+1,a+1+n,cmp1);//按first进行排序
for(int i=1;i<=n;i++)
std::cout<<a[i].first<<" "<<a[i].second<<std::endl;
std::sort(a+1,a+1+n,cmp2);//按second进行排序
for(int i=1;i<=n;i++)
std::cout<<a[i].first<<" "<<a[i].second<<std::endl;
return 0;
}
```
# 字符串string
begin
语法:iterator begin();
解释:begin()函数返回一个迭代器,指向字符串的第一个元素.
end
语法:iterator end();
解释:end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置).
rbegin
语法:const reverse_iterator rbegin();
解释:rbegin()返回一个逆向迭代器,指向字符串的最后一个字符。
rend
语法:const reverse_iterator rend();
解释:rend()函数返回一个逆向迭代器,指向字符串的开头(第一个字符的前一个位置)。
![](https://cdn.luogu.com.cn/upload/pic/47525.png)
用法举例:
```cpp
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1,str2;
cin >> str1;
//定义一个正向迭代器
string::iterator ptr1 = str1.begin();
//正向输出字符串
while (ptr1 != str1.end())
cout << *(ptr1++) << " ";
cout << endl;
cin >> str2;
//定义一个逆向迭代器
string::reverse_iterator ptr2 = str2.rbegin();
//逆向输出字符串
while (ptr2 != str2.rend())
//注意逆向迭代器移动方向相反,所以从尾部仍然通过++来移动
cout << *(ptr2++) << " ";
cout << endl;
}
```