C++中的STL——vector类的基本使用

目录

vector介绍

vetor类定义

vector常见构造

vector类中的容量操作

size()函数与capacity()函数

resize()函数

reserve()函数

max_size()函数

vector类中的数据遍历操作

operator[]()与at()函数

vector类中的迭代器遍历

正向遍历begin()和end()迭代器——非const

逆向遍历rbegin()和rend()迭代器——非const

正向遍历begin()和end()迭代器——const

逆向遍历rbegin()和rend()迭代器——const

vector类中数据修改操作

assign()函数

push_back()函数

pop_back()函数

insert()函数

erase()函数

swap()函数

find()函数


vector介绍

  1. vector是表示可变大小数组的序列容器。就像数组一样,vector也采用连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  2. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  3. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  4. 与其他动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

vetor类定义

template < class T, class Alloc = allocator<T> > class vector; 

vector类为类模板,所以在使用时需要带上类型表示一个具体的类,例如数据类型为int类型的vector使用时需要写为vector<int>

vector常见构造

构造函数

函数原型

无参构造函数

explicit vector ();

使用指定个数个元素构造函数

explicit vector (size_type n, const value_type& val = value_type());

使用指定对象的迭代器区间进行构造

template <class InputIterator>

vector (InputIterator first, InputIterator last);

拷贝构造函数

vector (const vector& x);

📌

上面表格中的前三个构造函数均含有自定义空间配置器并带有缺省值,目前只使用默认即可

📌

使用vector类需要包含头文件<vector>

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    //无参构造函数
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }

    return 0;
}
输出结果:
1 2 3 4

上面的代码中,使用vector类的无参构造函数时创建了一个数据类型为int类型的vector类对象,编译器不会自动开辟空间因为没有数据,所以当前的size为0,可以使用push_back()函数进行数据插入,插入数据时会动态分配空间

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    //使用指定个数个数据构造
    vector<int> v(10, 1);//使用10个1进行构造
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }

    return 0;
}
输出结果:
1 1 1 1 1 1 1 1 1 1

如果不指定初始化内容,则默认初始化为0

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v(10);

    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}
输出结果:
0 0 0 0 0 0 0 0 0 0
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    //使用其他对象的迭代器区间进行构造
    vector<int> v(10, 1);
    vector<int> v1(v.begin(), v.end());

    for (size_t i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }
    cout << endl;
    string s1 = "hello world";
    vector<char> v2(s1.begin(), s1.end());
    for (size_t i = 0; i < v2.size(); i++)
    {
        cout << v2[i] << " ";
    }

    return 0;
}
输出结果:
1 1 1 1 1 1 1 1 1 1
h e l l o   w o r l d

vector类中的容量操作

函数

功能

size()

获取当前存储的有效数据个数

resize()

修改调用对象的容量并初始化为指定内容

capacity()

获取当前存储的空间大小

reserve()

扩容调用对象的空间大小

max_size()

获取调用对象空间可以存储的有效数据最大个数

size()函数与capacity()函数

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    cout << "指定大小为10时:\n";
    vector<int> v(10, 1);

    cout << v.size() << endl;
    cout << v.capacity() << endl;

    vector<int> v1;
    v1.push_back(1);
    v1.push_back(1);
    v1.push_back(1);
    v1.push_back(1);
    cout << "插入四个数据时:\n";
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;
    cout << "插入五个数据时:\n";
    v1.push_back(1);
    cout << v1.size() << endl;
    cout << v1.capacity() << endl;

    return 0;
}
输出结果:
指定大小为10时:
10
10
插入四个数据时:
4
4
插入五个数据时:
5
6

在VS下,vetor中的capacity不同于string中的capacity,在vector类中,除指定大小以外,当只有四个数据时,capacity大小等于size的大小,当数据个数超过四个时,capacity大于sizecapacity以1.5倍增长),而string类的capacity大于size的大小

resize()函数

使用resize()函数可以改变调用对象的sizecapacity大小,如果指定的大小小于size时相当于删除数据,当指定大小大于size时则作用为扩容+初始化(对于int默认初始化为0)

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v(10, 1);

    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;

    v.resize(20);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;

    v.resize(5);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    //指定大小小于当前的size时,再指定初始化内容时不会修改原始内容
    v.resize(3, 3);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}
输出结果:
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1
1 1 1

reserve()函数

使用reserve()函数可以更改调用对象的capacity的大小

📌

注意,如果指定大小小于当前的capacity时,则不会做任何处理

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v(10, 1);
    cout << "原始大小:\n";
    cout << v.capacity() << endl;
    cout << v.size() << endl;

    cout << "扩容到20:\n";
    v.reserve(20);
    cout << v.capacity() << endl;
    cout << v.size() << endl;

    cout << "扩容到5:\n";
    v.reserve(5);
    cout << v.capacity() << endl;
    cout << v.size() << endl;

    return 0;
}
输出结果:
原始大小:
10
10
扩容到20:
20
10
扩容到5:
20
10

在VS下,vector类同string类reserve()函数扩容倍数(1.5倍)基本一致

#include <iostream>
#include <vector>
using namespace std;
void TestVectorExpand()
{
    size_t sz;
    vector<int> v;
    sz = v.capacity();
    cout << sz << endl;
    cout << "making v grow:\n";
    for (int i = 0; i < 100; ++i)
    {
        v.push_back(i);
        if (sz != v.capacity())
        {
            sz = v.capacity();
            cout << "capacity changed: " << sz << '\n';
        }
    }
}

int main()
{
    TestVectorExpand();
    return 0;
}
输出结果:
0
making v grow:
capacity changed: 1
capacity changed: 2
capacity changed: 3
capacity changed: 4
capacity changed: 6
capacity changed: 9
capacity changed: 13
capacity changed: 19
capacity changed: 28
capacity changed: 42
capacity changed: 63
capacity changed: 94
capacity changed: 141

max_size()函数

使用max_size()函数可以获取调用对象空间可以存储的数据类型对应可以存储的数据总个数

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    cout << v.max_size() << endl;

    vector<char> v1;
    cout << v1.max_size() << endl;

    return 0;
}
输出结果:
4611686018427387903
9223372036854775807

vector类中的数据遍历操作

函数

功能

begin()+end()

begin获取第一个数据的迭代器 + end获取最后一个数据下一个位置的迭代器

operator[]()

vector类中的[]运算符重载函数

范围for()

C++11支持更简洁的范围for的新遍历方式

at()

指定位置遍历调用对象空间内容

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v1;

    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    v1.push_back(5);
    v1.push_back(6);

    //迭代器遍历
    vector<int>::iterator it = v1.begin();
    while (it != v1.end())
    {
        cout << *it << " ";
        it++;
    }
    cout << endl;
    //下标遍历
    for (size_t i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " "; 
    }
    cout << endl;
    //范围for
    for (auto num : v1)
    {
        cout << num << " ";
    }
    return 0;
}
输出结果:
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6

operator[]()at()函数

operator[]()函数与at()函数都是下标遍历,区别是operator[]()函数越界访问时断言报错,而at()函数抛出异常

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v(10, 1);
    cout << v[11] << endl;

    return 0;
}

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v(10, 1);
    try
    {
        cout << v.at(11) << endl;    
    }
    catch (const std::exception& e)
    {
        cout << e.what() << endl;;
    }

    return 0;
}
输出结果:
invalid vector subscript

vector类中的迭代器遍历

函数

功能

begin()

iterator begin();(非const对象调用)

const_iterator begin() const;const对象调用)

end()

iterator end();(非const对象调用)

const_iterator end() const;const对象调用)

正向遍历begin()end()迭代器——非const

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v(10, 1);
    //正向迭代器——非const
    vector<int>::iterator it = v.begin();
    while (it != v.end())
    {
        *it = 2;//可修改
        cout << *it << " ";
        it++;
    }

    return 0;
}
输出结果:
2 2 2 2 2 2 2 2 2 2

逆向遍历rbegin()rend()迭代器——非const

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    //逆向迭代器——非const
    vector<int>::reverse_iterator rit = v.rbegin();
    while (rit != v.rend())
    {
        (*rit)++;//可修改
        cout << *rit << " ";
        rit++;
    }

    return 0;
}
输出结果:
5 4 3 2

📌

逆向遍历也可也使用rbegin()rend()

正向遍历begin()end()迭代器——const

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);

    vector<int>::const_iterator cit = v.begin();
    while (cit != v.end())
    {
        //(*cit)++;不可修改
        cout << *cit << " ";
        cit++;
    }
    return 0;
}
输出结果:
1 2 3 4

📌

const逆向遍历也可以使用cbegin()cend()

逆向遍历rbegin()rend()迭代器——const

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);

    vector<int>::const_reverse_iterator crit = v.rbegin();
    while (crit != v.rend())
    {
        //(*crit)++;不可修改
        cout << *crit << " ";
        crit++;
    }

    return 0;
}
输出结果:
4 3 2 1

📌

const逆向遍历也可以使用rcbegin()rcend()

vector类中数据修改操作

函数

功能

assign()

为调用对象空间重新分配内容为指定内容

push_back()

在调用对象空间中的已有内容后方插入内容

pop_back()

删除调用对象空间中的最后一个内容

insert()

在调用对象空间中指定位置插入内容

erase()

删除调用对象空间中指定内容

swap()

交换调用对象的内容以及指定对象的内容

find()

查找函数(算法库中的模板函数)

assign()函数

使用assign()函数可以为调用对象分配指定内容,如果调用对象中原来有内容,将会替换为指定内容,并改变size为指定内容大小

函数

函数原型

assign()

template <class InputIterator>

void assign (InputIterator first, InputIterator last);

(使用一个对象的迭代器区间为调用对象分配内容)

void assign (size_type n, const value_type& val);

(指定n个内容为调用对象分配)

//使用一个对象的迭代器区间为调用对象分配内容
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    //vector<int> v(5, 1);
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);

    for (auto num : v)
    {
        cout << num << " ";
    }
    cout << endl;

    vector<int> v1(10, 2);

    //v.assign(v1.begin(), v1.end());
    v.assign(v1.begin(), v1.end());
    for (auto num : v)
    {
        cout << num << " ";
    }
    return 0;
}
输出结果:
1 2 3 4
2 2 2 2 2 2 2 2 2 2

//指定n个内容为调用对象分配
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    //vector<int> v(5, 1);
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);

    for (auto num : v)
    {
        cout << num << " ";
    }
    cout << endl;

    //vector<int> v1;
    //v1.push_back(5);
    //v1.push_back(6);
    //v1.push_back(7);
    //v1.push_back(8);

    //v.assign(v1.begin(), v1.end());
    v.assign(10, 5);
    for (auto num : v)
    {
        cout << num << " ";
    }
    return 0;
}
输出结果:
1 2 3 4
5 5 5 5 5 5 5 5 5 5

push_back()函数

使用push_back()函数可以在调用对象空间中插入一个指定内容

函数

函数原型

push_back()

void push_back (const value_type& val);

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}
输出结果:
1 2 3 4

pop_back()函数

使用pop_back()函数可以删除调用对象内容中的最后一个数据

函数

函数原型

pop_back()

void pop_back();

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    v.pop_back();
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}
输出结果:
1 2 3 4
1 2 3

insert()函数

使用insert()函数可以调用对象空间中的指定位置插入指定内容

📌

插入过程中涉及数据的挪动,故不推荐频繁使用

函数

函数原型

insert()

iterator insert (iterator position, const value_type& val);

(在指定的迭代器位置前插入内容val

void insert (iterator position, size_type n, const value_type& val);

(在指定的迭代器位置前开始插入nval

template <class InputIterator>

void insert (iterator position, InputIterator first, InputIterator last);

(在指定的迭代器位置前开始插入一个其他对象对应的迭代器区间中的内容)

📌

使用迭代器插入数据时尽量考虑迭代器失效问题,可能指定位置是野指针

//在指定的的迭代器位置后插入内容val
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.begin() + 3, 5);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}
输出结果:
1 2 3 4
1 2 3 5 4

//在指定的迭代器位置后开始插入n个val
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    v.insert(v.begin() + 3, 5, 10);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    return 0;
}
输出结果:
1 2 3 4
1 2 3 10 10 10 10 10 4

//在指定的迭代器位置后开始插入一个其他对象对应的迭代器区间中的内容
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    vector<double> v1;
    v1.push_back(5.2);
    v1.push_back(6.3);
    v1.push_back(7.4);
    v1.push_back(8.5);

    //根据调用对象的类型决定强制转换的类型
    v.insert(v.begin() + 3, v1.begin(), v1.end());//将double强制转换成int类型存入int类型的vector对象
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    v1.insert(v1.begin() + 3, v.begin(), v.end());//将int强制转换成double类型存入double类型的vector对象
    for (size_t i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }

    return 0;
}
输出结果:
1 2 3 4
1 2 3 5 6 7 8 4
5.2 6.3 7.4 1 2 3 5 6 7 8 4 8.5

erase()函数

使用erase()函数可以删除调用对象指定位置的指定内容

函数

函数原型

erase()

iterator erase (iterator position);

(删除指定位置的一个数据)

iterator erase (iterator first, iterator last);

(删除迭代器区间中的内容)

📌

使用迭代器删除数据时注意迭代器失效问题,在VS和g++下结果不同,可能指定位置导致结果未定义

//删除指定位置的一个数据
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;

    vector<int>::iterator it = v.begin() + 1;
    v.erase(it);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    //不可以再删除迭代器一开始指向的位置,存在迭代器失效问题
    //v.erase(it);
    //如果还需要删除下标为1的位置需要再将迭代器更新
    it = v.begin() + 1;
    v.erase(it);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }

    return 0;
}
输出结果:
1 2 3 4
1 3 4
1 4

//删除迭代器区间中的内容
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
    v.erase(v.begin() + 2, v.end());
    for (size_t i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;

    return 0;
}
输出结果:
1 2 3 4
1 2

swap()函数

使用swap()函数可以交换调用对象和指定对象中的数据

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    vector<int>    v1(5, 1);

    cout << "交换前:\n";
    cout << "v的size:" << v.size() << endl;
    cout << "v的capacity:" << v.capacity() << endl;
    for (auto num : v)
    {
        cout << num << " ";
    }
    cout << endl;
    cout << "v1的size:" << v1.size() << endl;
    cout << "v1的capacity:" << v1.capacity() << endl;
    for (auto num : v1)
    {
        cout << num << " ";
    }

    v.swap(v1);

    cout << "\n交换后:\n";
    cout << "v的size:" << v.size() << endl;
    cout << "v的capacity:" << v.capacity() << endl;
    for (auto num : v)
    {
        cout << num << " ";
    }
    cout << endl;
    cout << "v1的size:" << v1.size() << endl;
    cout << "v1的capacity:" << v1.capacity() << endl;
    for (auto num : v1)
    {
        cout << num << " ";
    }
    return 0;
}
输出结果:
交换前:
v的size:4
v的capacity:4
1 2 3 4
v1的size:5
v1的capacity:5
1 1 1 1 1
交换后:
v的size:5
v的capacity:5
1 1 1 1 1
v1的size:4
v1的capacity:4
1 2 3 4

find()函数

使用find()函数可以在指定迭代器区间查找指定内容

📌

find()函数不是vector库中的函数,使用时可以选择包含头文件<algorithm>

函数

函数原型

find()

template <class InputIterator, class T>

InputIterator find (InputIterator first, InputIterator last, const T& val);

#include <iostream>
#include <vector>
//#include <algorithm>
using namespace std;

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);

    vector<int>::iterator it = find(v.begin(), v.end(), 3);
    cout << *it << endl;
    return 0;
}
输出结果:
3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/518826.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

adobe stock会员开通付费付款订阅充值教程/adobe stock免费白嫖一个月

登录adobe stock的官网&#xff0c;点击你想要下载的视频&#xff0c;然后点击免费下载&#xff0c;我们点击免费试用按钮&#xff0c;可以看到非常贵&#xff0c;需要80美金一个月&#xff0c;用fomepay可以免费白嫖一个月 点击获取一张虚拟信用卡&#xff0c;就可以白嫖一个…

基于JAVA+SpringBoot+Vue的前后端分离的大学健康档案管理系统

一、项目背景介绍&#xff1a; 随着社会的发展和科技的进步&#xff0c;人们越来越重视健康问题。大学作为培养人才的摇篮&#xff0c;学生的健康状况直接影响到国家的未来。然而&#xff0c;传统的大学健康档案管理方式存在诸多问题&#xff0c;如信息不透明、数据分散、更新不…

【MySQL数据库 | 第二十二篇】深入了解MySQL锁

前言&#xff1a; MySQL作为世界上最流行的关系型数据库管理系统之一&#xff0c;广泛应用于各种规模和类型的应用程序中。在处理高并发和大规模数据操作时&#xff0c;确保数据的一致性和完整性是至关重要的。而MySQL的锁机制正是在这样的背景下发挥着重要作用。 MySQL锁机制…

LeetCode 热题 100 | 贪心算法

目录 1 121. 买卖股票的最佳时机 2 55. 跳跃游戏 3 45. 跳跃游戏 II 4 763. 划分字母区间 菜鸟做题&#xff0c;语言是 C 1 121. 买卖股票的最佳时机 解题思路&#xff1a; 维护一个变量 max_pricemax_price 用于存储排在 i 天之后的股票最高价格第 i 天的最高利润 …

地质地貌卫星影像集锦(三 矿产资源篇)

1. 元古代沉积岩的抬升 这个地区位于Leigh Creek中部&#xff0c;距离澳大利亚南部的阿德莱德约500km&#xff0c;弗林德斯山脉的北面是Gawler克拉通。弗林德斯山脉是由元古代沉积岩抬升后形成的块体&#xff0c;在其之下的是寒武纪的岩石&#xff0c;它座落在距阿德莱德北…

唐刘:关于产品质量的思考 - 我的基本认知

我在文章《 TiDB in 2023 - 一次简单的回顾 》 中提到了一个我一直以来面临的问题&#xff1a;每次 TiDB 发布新版本后&#xff0c;我如何能够非常自信地告诉客户&#xff0c;这个版本的质量很好&#xff0c;大家可以放心使用呢&#xff1f; 坦白地说&#xff0c; 这个问题并不…

[HackMyVM]靶场Deeper

难度:Easy kali:192.168.56.104 靶机:192.168.56.148 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.148 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-05 19:55 CST Nmap scan report for 192.168.56.148 Host is up (0.00013s latency). N…

数据结构:详解【树和二叉树】

1. 树的概念及结构&#xff08;了解&#xff09; 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝…

智慧公厕升级为多功能城市智慧驿站,助力智慧城市发展

在现代城市的建设中&#xff0c;公共厕所作为基础必备的民生设施&#xff0c;一直是城市管理的重要组成部分。随着科技的不断发展&#xff0c;智慧公厕应运而生&#xff0c;成为了公共厕所信息化、数字化、智慧化的应用解决方案。而近年来&#xff0c;智慧公厕也进行了升级发展…

20240309web前端_第三周作业_教务系统页面

作业&#xff1a;教务系统页面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

拥塞控制算法系列之:Swift-谷歌2020年SIGCOM-包级别端到端TIMELY拥塞控制算法

核心要点&#xff1a; 谷歌 2020 SIGCOM基于delay的AIMD拥塞拆分EC和FC&#xff0c;时延敏感场景优势分别计算EC和FC的wnd&#xff08;最核心&#xff09;保障吞吐和低延迟。Swift 因利用延迟的简单性和有效性而闻名包级别的论文&#xff1a;https://dl.acm.org/doi/pdf/10.11…

【保姆级讲解如何计算机视觉入门】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

江协STM32:对射式红外传感器计次和旋转编码器计次

对射式红外传感器计次 还是复制粘贴之前的文件 创建外部中断文件 然后写初始化函数 外部中断函数创建 这里写外部中断函数 看着这个图来配置 具体步骤就是&#xff1a; 第一步&#xff0c;配置RCC&#xff0c;把我们这里涉及的外设的时钟都打开&#xff0c;不打开时钟&#…

深入浅出 -- 系统架构之微服务中OpenFeign最佳实践

前面我们讲了一下 Ribbon 和 RestTemplate 实现服务端通信的方法&#xff0c;Ribbon 提供了客户端负载均衡&#xff0c;而 RestTemplate 则对 http 进行封装&#xff0c;简化了发送请求的流程&#xff0c;两者互相配合&#xff0c;构建了服务间的高可用通信。 但在使用后也会发…

c++的学习之路:12、vector(1)

这章主要是根据cplusplus中的文档进行使用Vector&#xff0c;文章末附上测试代码。 目录 一、什么是vector 二、vector的简单使用 三、代码 一、什么是vector 下图是cplusplus的简介&#xff0c;上面一共有六点&#xff0c;如下&#xff1a; 1、vector是表示可变大小数组…

Leetcode 216.组合总和III

题目 思路 题目说只使用数字1-9&#xff0c;是k个数的和 树的宽度是1-9&#xff0c;树的深度是k 1.确定递归函数的返回值及参数&#xff1a; 返回值是void,参数这里还是先设定两个全局变量。一个是path存放符合条件单一结果。如&#xff1a;&#xff08;1&#xff0c;2&…

VSCODE EIDE使用debug记录

用上vscode之后就感觉之前的keil不太爽了&#xff0c;找什么东西搜索都很麻烦&#xff0c;之前有写过eide的文章&#xff0c;想着能不能在eide里面就把debug也做了&#xff0c;发现真的可以&#xff0c;下面记录一下&#xff0c;主要是参考这个大佬的文章&#xff0c;非常感谢。…

微电网优化:基于肝癌算法(Liver Cancer algorithm, LCA)的微电网优化(提供MATLAB代码)

一、微电网优化模型 微电网是一个相对独立的本地化电力单元&#xff0c;用户现场的分布式发电可以支持用电需求。为此&#xff0c;您的微电网将接入、监控、预测和控制您本地的分布式能源系统&#xff0c;同时强化供电系统的弹性&#xff0c;保障您的用电更经济。您可以在连接…

离线数仓(十)【ADS 层开发】

前言 剩下的 ADS 层主要就是写 SQL 了&#xff0c;就像我们之前练习的 HQL 题一样&#xff0c;不同的是这里的数据从哪张表读取&#xff08;DWD 还是 ADS 甚至个别表需要从 DIM 层读取&#xff09;需要我们自己来分析。 ADS 的建表语句和 MySQL 是对应的&#xff0c;我们到时候…

网络协议——HTTP协议

目录 ​编辑 一&#xff0c;HTTP协议基本认识 二&#xff0c;认识URL 三&#xff0c;http协议的格式 1&#xff0c;发送格式 2&#xff0c;回应格式 四&#xff0c;服务端代码 五&#xff0c;http报文细节 1&#xff0c;Post与Get方法 2&#xff0c;Content_lenth 3&…