再遇 STL
前言
去年寒假集训时整理了一篇关于 STL 的文章,今年借着给学弟学妹讲课的机会再整理一下 STL 的相关知识。
上一篇文章只是简单罗列了一下内容和语法,这篇文章再补充一些基础内容.
前情回顾:常用的 STL 汇总
补充内容
学校第一学期开授的程序设计课程使用的为 C 语言,因此在正式介绍 STL 之前会简单的介绍一下竞赛中基础的 C++ 知识。( C++ 的最大特性应当是它的面向对象,但是竞赛选手很少使用它的面向对象,所以也戏称我们使用的是 C with STL)
新类型 string
C 中我们常常使用 char 数组配合 scanf("%s",str) 读入字符串,但是在 C++ 中封装了更为便捷的 string 类型。
访问指定字符 以及 输入输出
string 和字符数组十分类似,可以直接通过下标运算符 [] 访问指定的字符,并且可以通过赋值的方式修改当前字符。换句话说,你可以将 string 类型的字符串看做一个更加便捷的字符数组。
string 的读入和字符数组的读入规则是类似的,当遇到“空格”“换行”时会自动断开。在 C 中我们会使用 gets() 进行处理,但是 gets() 在 C++ 中已经被废弃了,所以使用 getline() 处理读入一行的操作。
string str;
// 正常读入,遇到空格或者换行结束
cin>>str;
cout<<str;
// 读入一行,遇到空格不结束,换行结束
getline(cin,str);
cout<<str<<endl;
// 输出第 0 位的字符
cout<<str[0]<<endl;
被重载运算符 以及 常用的方法
string 对常用的 + += = 以及比较运算符 > < 等进行了重载,从而可以进行更为便捷的拼接、复制、比较操作,不需要再依赖 strcat() strcpy() 等函数。
除此之外,string 还有封装好的一些方法可以调用,对其方法的调用和结构体访问成员类似,均使用成员运算符 . :
| 运算符/方法名 | 方法效果 |
|---|---|
+ |
当 + 两侧均为字符串或字符时(可以为字符串常量或者 char 类型)可以将其拼接 |
= |
将 str 右侧的字符串赋值给左侧字符串,是深拷贝,而非复制的引用 |
> >= < <= |
按照字典序比较字符串大小,因为比较运算符被重载了,因此可以直接调用 sort() 进行排序 |
size() |
返回字符串的实际长度,效果和 strlen() 相同。 |
substr(begin, length) |
传入开始位置(从0开始)以及要截取的长度,返回截取的字符串 |
string str1, str2;
cin >> str1;
for (int i = 0; i < str1.size(); i++)
{
cout << str1[i];
}
cout << endl;
cin >> str2;
cout << str1 + " " + str2 << endl;
cout << str1 + " not " + str2 << endl;
cout<<str2.substr(0,3);
运行示例:

string str1, str2;
cin >> str1>> str2;
if(str1 > str2)
{
cout<<str1<<" bigger than "<<str2<<endl;
}else{
cout<<str1<<" smaller than "<<str2<<endl;
}
运行示例:

sort()
在 c++ 中想要实现快速的排序,不需要再手动实现排序函数,只需要调用 sort() 函数即可。
sort() 可以对数组进行排序,也可以对 STL 中的 vector 进行排序,默认为从小到大排序。其参数列表包含两个必选参数和一个可选参数: sort(begin, end, cmp)。
sort() 的调用
| 参数 | 是否必选 | 参数意义 |
|---|---|---|
begin |
是 | 传入一个指针或者迭代器,表示要排序的开始位置 |
end |
是 | 传入一个指针或者迭代器,表示要排序的结束位置 |
cmp |
否 | 排序的规则,默认为从小到大排序 |
- 数组排序
可以采用数组名+偏移量的方式设置排序范围:sort(arr, arr + 10); vector排序
与数组类似,但是可以直接使用begin()end获取首尾迭代器,从而对整个容器进行排序:- 带
cmp参数的排序
想要实现自定义排序有两种方式:- 自定义
cmp函数 - 使用
greaterless
- 自定义
sort(arr, arr+10);//数组排序
sort(arr.begin(), arr.end());// vector 排序
sort(arr,arr+10,cmp);// 自定义 cmp 函数
sort(arr,arr+10,greater<int>()); // 使用 greater
通常我们的 cmp 函数都是这样的:
int cmp(int a, int b)
{
return a > b;
}
实际上自定义的 cmp 和 greater less 是一样的,本质上都是比较规则作出了规定。
return a>b 实际上是返回了一个布尔值,a 表示前一个元素,b表示后一个元素。上述示例的 cmp 函数的作用就是当前一个元素大于后一个元素的时候返回 true ,等效于使用 greater。
运算符的重载
在使用结构体时我们需要进行运算符的重载(overload)才能够正常的使用 sort() 以及一些容器。
除了像上面使用 cmp 对运算规则进行定义以外,更常用的是在结构体中进行重载。
语法如下:
struct node
{
int x, y;
bool operator<(const node &o) const
{
if (x == o.x)
{
return y < o.y;
}
return x < o.x;
}
};
对于运算规则的定义,可以直接在 bool operator<(const node &o) const 中进行修改。
