再遇 STL

再遇 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-result-1

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

运行示例:

string-result-2

sort()

c++ 中想要实现快速的排序,不需要再手动实现排序函数,只需要调用 sort() 函数即可。

sort() 可以对数组进行排序,也可以对 STL 中的 vector 进行排序,默认为从小到大排序。其参数列表包含两个必选参数和一个可选参数: sort(begin, end, cmp)

sort() 的调用

参数 是否必选 参数意义
begin 传入一个指针或者迭代器,表示要排序的开始位置
end 传入一个指针或者迭代器,表示要排序的结束位置
cmp 排序的规则,默认为从小到大排序
  1. 数组排序
    可以采用数组名+偏移量的方式设置排序范围:sort(arr, arr + 10);
  2. vector 排序
    与数组类似,但是可以直接使用 begin() end 获取首尾迭代器,从而对整个容器进行排序:
  3. cmp 参数的排序
    想要实现自定义排序有两种方式:

    1. 自定义 cmp 函数
    2. 使用 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;
}

实际上自定义的 cmpgreater 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 中进行修改。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇