刷LeetCode必备的C++STL基础

写在前面:这篇笔记是由本人原创,兄弟萌如果觉得不错的话,可以点个关注或收藏,方便以后查阅呀。

文章目录

前言

最近在刷LeetCode上的算法题目,如果想要游刃有余的做这些题目,掌握一门高级计算机编程语言的函数库是必不可少的,C++的标准模板库(STL)是一个不错的选择。为了记录这几天的学习成果,同时方便今后的查阅,遂写下这篇STL的学习笔记。
C++的STL博大精深,内容非常广泛,这篇笔记按照重要程度只对常用的容器和算法做简单而必要的介绍。

一、STL概述:六大模块

C++标准模板库由6大模块组成:分配器、容器、迭代器、算法、仿函数和适配器。
其中,容器container用来存储数据元素,迭代器iterator可以理解为类指针,即封装的指针,算法algorithm通过迭代器操纵容器中的元素。一个简单例子就是:sort(it1, it2)是STL中的一个排序算法,它通过迭代器it1,it2来确定容器的数据范围[it1, it2),从而对容器中的这部分数据进行排序(操纵)。
在这里插入图片描述

二、输入输出

1. C++标准输入输出

cin负责输入,cout负责输出。

1.1 特点

cin和cout不用设置输入输出数据的格式,可以直接进行输入输出,但是开销比较大,有时候在LeetCode上容易超时,所以推荐使用C语言的标准输入输出函数scanf和printf。

1.2 导入

#include < iostream >
using namespace std;

1.3 使用

输入1:cin >> var1 >> var2 >> var3 >> ... ;
可以用回车换行作为变量之间的分隔符。
输入2:cin.getline(str, 100)
读取一行,str是缓冲区的起始位置,100是缓冲区的大小,如定义一个缓冲区数组:char str[100];
输入3:getline(cin, str)
读取一行,这里str是一个string字符串对象。
输出:cout << var1 << var2 << "\n" << endl;
输出换行符有两种方式:
方式1:输出 “\n”
方式2:输出 endl

2. C标准输入输出

2.1 特点

必须指定格式,效率比cin、cout高,推荐使用。

2.2 导入

#include <stdio.h>

2.3 使用

输入:scanf("%d%f%c", &var1, &var2, &var3);
输入一个整数、小数、字符,可以以空格为分隔符,回车换行作为结束符。
输出:printf("%d, %f, %c", var1, var2, var3);
输出一个整数、小数、字符并以逗号为分隔符。

三、vector:变长数组容器

1. 底层

底层是顺序结构——数组,当容量不足时,重新分配一个更大的连续数组。

2. 作用

存储不定长数据;
以邻接表的方式存储图(二维vector)。

3. 导入

#include < vecrot >
using namespace std;

4. 定义

形式1:vector< typename > vi;
可以理解为定义了一个变长数组:vi[size],size可变。
形式2:定义一个vector数组:
vector< typename > a[100];
形式3:定义一个二维vector:
vector< vector< int > > vi;
形式2与形式3的区别在于:前者一维长度固定为100,而后者两个维度均是可变的。

5. vector迭代器

5.1 迭代器定义

vector< typename >::iterator it;
相当于是一个类指针。

5.2 迭代器运算

5.2.1 自增

形式1:it ++;
形式2:++ it;

5.2.2 自减

形式1:it --;
形式2:-- it;

5.2.3 移位

it + n,即迭代器加整数,表示迭代器it所对应位置后n位对应的迭代器,如:vi.begin() + i指向vi[i]。
it - n,即迭代器减整数,表示迭代器it所对应位置前n位对应的迭代器。
只有容器vector和string的迭代器才支持这种迭代器加减整数的移位操作。

5.2.4 比较

迭代器不支持it < vi.end()的比较操作,而只能是:it != vi.end(),用在循环中判断是否到达容器末尾。

5.3 使用迭代器循环遍历容器

for (vector< int >::iterator it = vi.begin(); it != vi.end(); it ++){pass}

6. 访问元素

通过下标和迭代器两种方法访问。

6.1 下标访问

下标从0开始,vi[i]返回第i + 1个元素。

6.2 迭代器访问

如:
vector< int >::iterator it = vi.begin() + i;
*it 代表第i + 1个元素。

7. 常用方法

假设vector< int > vi;

7.1 vi.begin()

返回第一个元素位置对应的迭代器。

7.2 vi.end()

返回最后一个元素后一个位置对应的迭代器,通常作为循环的结束标志。

7.3 vi.push_back()

vi.push_back(x)
末尾添加x。

7.4 vi.pop_back()

vi.pop_back()
删除末尾元素。

7.5 vi.size()

vi.size()
返回元素个数。

7.6 vi.clear()

vi.clear()
清空所有元素。

7.7 vi.insert()

vi.insert(it, x)
在迭代器it对应的位置插入x,后面元素均后移一位。

7.8 vi.erase()

7.8.1 vi.erase(it)

vi.erase(it)
删除迭代器it指向的单个元素。

7.8.2 vi.erase(first, last)

vi.erase(first, last)
删除前闭后开区间[first, last)内的所有元素。

四、set:集合容器

1. 底层和特性

内部使用红黑树(一种平衡二叉查找树)实现。
特性1:自动去重,元素不重复。
特性2:自动排序,即把它看做是一个序列,这个序列从小到大排列。

2. 作用

自动去重并按升序排列。

3. 导入

#include < set >
using namespace std;

4. 定义

形式1:set< typename > st;
形式2:定义一个set数组:
set< typename > a[100];
形式3:定义一个嵌套集合:
set< vector< int > > st;

5. set迭代器

5.1 迭代器定义

set< typename >::iterator it;
相当于是一个类指针。

5.2 迭代器运算

5.2.1 自增

形式1:it ++;
形式2:++ it;

5.2.2 自减

形式1:it --;
形式2:-- it;
只有容器vector和string的迭代器才支持这种迭代器加减整数的移位操作(因为它们支持下标访问元素),set的迭代器不支持这种操作。

5.2.3 比较

迭代器不支持it < st.end()的比较操作,而只能是:it != st.end(),用在循环中判断是否到达容器末尾。

5.3 使用迭代器循环遍历容器

for (set< int >::iterator it = st.begin(); it != st.end(); it ++){pass}

6. 访问元素

只能通过迭代器访问。
如:
set< int >::iterator it = st.begin() + i;
*it 代表第i + 1个元素。

7. 常用方法

假设set< int > st;

7.1 st.begin()

返回第一个元素位置对应的迭代器。

7.2 st.end()

返回最后一个元素后一个位置对应的迭代器,通常作为循环的结束标志。

7.3 st.size()

st.size()
返回元素个数。

7.4 st.clear()

st.clear()
清空所有元素。

7.5 st.insert()

st.insert(x)
插入元素x,自动去重和递增排序。
时间复杂度:O(logN)。

7.6 st.find()

st.find(value)
查找value,返回对应的迭代器。
时间复杂度:O(logN)。

7.7 st.erase()

7.7.1 st.erase(it)

st.erase(it)
删除迭代器it指向的单个元素。
通常与st.find(x)搭配使用,如:
st.erase(st.find(x)) 删除元素x。

7.7.2 st.erase(value)

st.erase(value)
删除指定元素值value。

7.7.3 st.erase(first, last)

st.erase(first, last)
删除前闭后开区间[first, last)内的所有元素。

五、string:字符串容器

1. 底层

底层是顺序结构——字符数组。

2. 作用

存储字符串。

3. 导入

#include < string >
using namespace std;
注意:与#include <string.h>不一样。

4. 定义

形式1:string str;
可以理解为定义了一个字符数组:char str[size],size可变。
形式2:初始化字符串:
string str = "abcd";

5. 字符串输入输出

5.1 字符串输入

cin >> str; 回车换行标志输入结束。

5.2 字符串输出

cout << str;

6. string迭代器

6.1 迭代器定义

string::iterator it;
相当于是一个类指针。

6.2 迭代器运算

6.2.1 自增

形式1:it ++;
形式2:++ it;

6.2.2 自减

形式1:it --;
形式2:-- it;

6.2.3 移位

it + n,即迭代器加整数,表示迭代器it所对应位置后n位对应的迭代器,如:str.begin() + i指向str[i]。
it - n,即迭代器减整数,表示迭代器it所对应位置前n位对应的迭代器。
只有容器vector和string的迭代器才支持这种迭代器加减整数的移位操作。

6.2.4 比较

迭代器不支持it < str.end()</

### 回答1: 1. 首先,需要在VSCode中安装C++插件,可以在扩展商店中搜索"C++",然后安装Microsoft官方提供的"C++"插件。 2. 接着,需要在本地安装C++编译器,比如gcc或者clang。可以在终端中输入"g++ --version"或者"clang++ --version"来检查是否已经安装。 3. 在VSCode中打开leetcode题目的文件夹,可以使用"Open Folder"命令,或者直接在终端中进入该文件夹。 4. 在VSCode中打开终端,可以使用"Terminal"菜单或者快捷键"Ctrl + ` "。 5. 在终端中输入命令"touch main.cpp",创建一个名为"main.cpp"的文件。 6. 在VSCode中打开"main.cpp"文件,开始编写代码。 7. 编写完代码后,在终端中输入命令"g++ main.cpp -o main",将代码编译成可执行文件。 8. 在终端中输入命令"./main",运行可执行文件,查看代码是否正确。 9. 如果代码正确,可以将代码提交到leetcode网站进行测试。 ### 回答2: VSCode 是一种非常流行的开源代码编辑器,可以用于编写各种计算机编程语言。LeetCode 是一种学习和练习算法的平台,它提供了许多编程问题和测试数据,使得程序员可以通过解决这些问题来提高编程能力。 为了在 VSCode 上 LeetCode,首先我们需要安装 C 语言的编译器和调试器。常见的 C 语言编译器有 gcc 和 clang,它们可以在大多数操作系统上运行,例如 Windows、Mac、Linux 等。同时,为了方便调试,我们可以安装 VSCode 的插件,例如 C/C++、Code Runner 等。 安装好编译器和插件后,我们需要在 VSCode 中创建一个新的 C 语言项目,例如可以在终端中使用命令 `mkdir my_leetcode` 创建一个新的目录,然后在 VSCode 中打开这个目录。接着,在 VSCode 的编辑器中创建一个新的 C 文件,例如 `main.c`,并且在这个文件中编写自己的 LeetCode 解法代码。要注意,我们需要包含正确的头文件,并且使用 main 函数来调用我们编写的算法。 编写完代码后,我们可以使用插件中的 Code Runner 来运行这个程序。在编辑器中按下快捷键 Ctrl+Alt+N,或者通过右键菜单选择 Run Code,就可以编译并运行我们的代码。同时,Code Runner 还可以在终端中显示程序的输出结果,方便调试和查看。 除了 Code Runner,我们还可以使用 VSCode 中内置的调试器来单步运行代码,查看变量的值和程序的执行流程。要使用调试器,我们需要在代码中打断点,然后点击 VSCode 的调试按钮来启动调试器。一旦程序到达断点,就可以逐步进行调试并查看变量的值,从而检查算法的正确性和性能。 总之,使用 VSCode LeetCode 能够较为方便地进行代码编写、调试和运行。我们只需要安装好对应的编译器和插件,然后按照标准的 C 语言写法来编写算法即可。通过不断地练习和掌握,我们能够更好地提高自己的编程水平和算法思维能力。 ### 回答3: VSCode是一种轻量级的代码编辑器,可以为编写代码提供丰富的功能和工具。它具有强大的语法高亮功能,可以轻松地切换不同的语言模式。对于leetcode来说,VSCode可以作为一个开发环境使用,主要有以下几个步骤: 第一步,安装和配置C/C++插件。在VSCode中,您需要安装一个C/C++插件,它可以用来编写和调试C/C++代码。安装该插件后,您需要根据自己的需求进行配置模板,以便更好地适应您的编程风格。 第二步,安装leetcode插件。为了方便,您可以通过在VSCode中安装leetcode插件,轻松访问leetcode网站并题。该插件提供了很多实用功能,包括搜索和筛选题目,提交代码并获得反馈等。 第三步,编写代码。通过安装C/C++插件,您可以在VSCode中轻松编写C/C++代码。在leetcode时,您可以使用VSCode的一些功能,例如代码折叠、语法高亮、代码补全等。 第四步,调试代码。VSCode中的C/C++插件还提供了一个非常强大的调试工具,可以帮助您调试C/C++代码。您可以在断点处暂停代码执行,查看变量值和堆栈信息等。这将大大简化调试过程。 总之,VSCode作为一个轻量级代码编辑器,具有强大的功能和工具,可以帮助您更轻松地leetcode。安装C/C++leetcode插件以及适当的配置,可以大大提高您的编程效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值