本篇文档默认用户学过C语言,目的不是让读者学会C++开发,而是能迅速上手使用C++来完成算法题(所以只介绍和算法有关的内容)
认识C++
头文件
C++的头文件:
#include <iostream>
using namespace std;
其实using namespace std;并不是头文件,但你别管,加上去就是了
C的头文件:
#inlcude <stdio.h>
输入和输出
在刷leetcode时几乎不会需要使用到输入和输出,都是class类里面的返回值;但实际上在各大公司的机考中基本都会使用输入输出来测试数据。
C++的输入可以使用cin和cout,下面是使用例。
输出一个hello world
#include <iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl; // endl在这里可以当做换行符来理解
return 0;
}
输入一个a和b,然后输出它们相加的结果
#include <iostream>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << "a + b的值为:" << a + b << endl;
return 0;
}
认识vector容器
vector简介
vector容器,在刷题之中将它理解为数组的替代品,需要在头文件包含:
#include <vector>
使用方法:将vector比作int、float之类的变量类型,使用vector<T>就可以创造一个数组,其中T是你想让它存储的数据类型,举个例子。
vector<int> arr;
这样呢,我们就创建好了一个vector数组,里面存放的是int型数据。
那是否用vector创造二维数组?当然也可以,让vector里面包含一个vector就行。
vector<vector<int>> dp;
vector构造
如果想要初始给vector设定一些信息的话,可以在构造的时候传递一些参数(C++构造函数相关知识)。
vector<int> arr1(3); // 初始arr1的数组容量为3,默认是0
vector<int> arr2(3, 1); // 初始arr2的数组容量为3,且每个元素都为1
vector<int> arr3{1, 3, 5, 7 9}; // 初始arr3的值为1, 3, 5, 7 9
vector<vector<int>> dp(3, vector<int>(4, -1)); // 3行4列dp数组,且每一个元素都是-1
vector内置功能
[]运算符
可以直接像使用数组一样使用[]来对vector进行操作
vector<int> arr(10);
for (int i = 0; i < 10; i++) {
arr[i] = i;
}
在末尾添加元素和删除元素
末尾添加元素:push_back()
末尾删除元素:pop_back()
vector<int> arr; // 现在数组是空数组
arr.push_back(3); // 现在数组有一个元素,是3
arr.push_back(4); // 现在数组有两个元素,分别是3、4
arr.push_back(5); // 现在数组有三个元素,分别是3、4、5
arr.pop_back(); // 现在数组有两个元素,分别是3、4
获取当前vector容器的大小
size()
cout << arr.size() << endl; // 输出结果是2
这玩意在算法题里真的很常用,直接就得到了vector数组的长度,经常在for循环里出现
重新设置vector容器的大小,变大补0,变少删除末尾元素
resize()
arr.resize(3); // 现在数组有三个元素,分别是3、4、0
cout << arr.size() << endl; // 输出结果是3
清空vector中的所有元素
clear()
arr.clear(); // 现在数组是空数组
cout << arr.size() << endl; // 输出结果是0
迭代器
使用vector容器之后就没有了所谓的指针的概念,类似的我们可以使用迭代器
其实我个人感觉迭代器在算法题里面没什么用,一般而言我们都不会去使用迭代器
在vector中迭代器名称为:vector<T>::iterator,如果嫌弃太麻烦在定义的时候可以直接使用auto,其他用法都和指针非常像(在这里,arr.begin()返回的是vector的最初位置迭代器,arr.end()返回的是vector最末位置的下一个位置的迭代器)
vector<int> arr(10); // 现在数组有10个元素,都是0
// 下面for循环里面可以直接写auto it = arr.begin(),C++很智能会自动帮你对好的
for (vector<int>::iterator it = arr.begin(); it != arr.end(); it++) {
cout << *it << ' ';
}
用一个指针相似理解
int arr[10]; // 注意这里其实没初始赋值
for (int *ptr = arr; ptr != arr + 10; ptr++) {
cout << *ptr << ' ';
}
在指定位置添加或删除元素
在指定位置添加元素:insert(),第一个参数为要插入的位置迭代器,第二个参数为要插入的值
删除指定位置的元素:erase(),唯一参数为要删除的位置迭代器
vector<int> arr(10); // 现在数组有10个元素,都是0
arr.insert(arr.begin() + 3, 4); // 现在数组有11个元素,分别是 0 0 0 1 0 0 0 0 0 0 0
arr.erase(arr.begin() + 3); // 现在位置有只剩10个元素了,全是0
为什么要使用vector
别问那么多,用就是了
一方面,vector容量可以随意改变,这比静态数组int[]要方便的多;另一方面,vector用完之后不需要像动态数组一样free或者delete,可以防止内存泄漏
而且vector内置的那些函数真的很好用
下面来一题练手吧
35.搜索插入的值
先别管(请必须使用时间复杂度为 这条限制,现在还在熟悉使用vector的阶段,先把它做出来就算成功O(log n)
的算法)
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
// 遍历所有nums数组里的值,如果target比nums数组的值要小说明到了该返回的时候
for (int i = 0; i < nums.size(); i++) {
if (target <= nums[i]) {
return i;
}
}
// 如果一直没返回,说明target要插入在最后一位
return nums.size();
}
};
看吧,实际上vector用起来也就是数组int[]那么回事()