1)快速上手C++、vector容器

本篇文档默认用户学过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;
}

3247e8546ef5473ab935fa78e542af35.png

认识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.搜索插入的值

35. 搜索插入位置 - 力扣(LeetCode)

先别管(请必须使用时间复杂度为 O(log n) 的算法)这条限制,现在还在熟悉使用vector的阶段,先把它做出来就算成功

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[]那么回事()

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值