再遇 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
函数 - 使用
greater
less
- 自定义
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
中进行修改。