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

news2024/12/29 11:31:24

目录

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

练习 22 Web [极客大挑战 2019]BuyFlag

php弱类型比较&#xff0c;注意Cookie值&#xff0c;php利用数组赋值进行绕过,科学计数法 很明显是弱类型比较&#xff0c;之前的练习题已经遇到过 构造password404adsffd&#xff0c;后面随便什么字母都行 然后 money100000000 然后在student这里卡了很久&#xff0c;post…

SpringData ElasticSearch - 简化开发,完美适配 Spring 生态

目录 一、SpringData ElasticSearch 1.1、环境配置 1.2、创建实体类 1.3、ElasticsearchRestTemplate 的使用 1.3.1、创建索引 设置映射 1.3.2、创建索引映射注意事项&#xff08;必看&#xff09; 1.3.3、简单的增删改查 1.3.4、搜索 1.4、ElasticsearchRepository …

当代软件专业大学生与青年在新质生产力背景下的发展探究

在新质生产力的浪潮中,信息技术以前所未有的速度革新,为软件专业的大学生和青年带来了丰富的机遇,同时也伴随着一系列的挑战。他们如何把握时代的脉搏,实现个人的发展,成为了值得深入探讨的话题。 一、新质生产力背景下的机遇 随着新质生产力的不断发展,信息技术在各个领…

Vue3中的computed,watch和watchEffect的特点

1.computed 1&#xff09;computed拥有缓存性&#xff0c;多次调用会直接从缓存中获取&#xff0c;而不会重新执行&#xff0c;所以说computed性能很高。 例&#xff1a;下面是同时调用三次计算属性firstTotal和三次函数firstTotalFun()的运行结果。可以发现&#xff0c;函数被…

免费微信小程序源码分享~搭起来改一下就可以【创业】

【前言】现在很多人都想做微信小程序创业搞钱&#xff0c;但是苦于不会开发或过高的开发成本只能放弃&#xff0c;下面我收集了几套微信小程序的源码供各位有梦想的同学免费使用~ 这些小程序代码都包含了客户端和管理端&#xff0c;你搭建起来就可以开始创业搞钱了~ 下载链接&…

基于SpringBoot+Vue共享客栈管理系统(源码+部署说明+演示视频+源码介绍)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(9)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 第一课 ——第三课素材文件 https://www.alipan.c…

设计模式总结-装饰者模式

模式动机 一般有两种方式可以实现给一个类或对象增加行为&#xff1a; 继承机制&#xff0c;使用继承机制是给现有类添加功能的一种有效途径&#xff0c;通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法。但是这种方法是静态的&#xff0c;用户不能控制增…

Java快速入门系列-5(Java进阶特性)

第五章:Java进阶特性 5.1 多线程与并发编程5.1.1 多线程基础5.1.2 线程同步与锁5.1.3 线程间通信与协作5.1.4 线程池5.2 Java I/O流5.2.1 字节流与字符流5.2.2 缓冲流5.2.3 对象序列化与反序列化5.3 网络编程基础5.3.1 Socket编程5.3.2 NIO编程5.4 Java反射机制反射的基本用法…

IDEA+Docker远程一键部署SpringBoot项目

一.引语 本文将学习使用IDEADocker远程一键部署SpringBoot项目&#xff0c;对比上传jar包到服务器&#xff0c;再通过java指令运行项目&#xff0c;极大程度的提高了项目部署效率。可谓不用不知道&#xff0c;一用再也停不下来~ 为了后续学习方便&#xff0c;需要提前进行如下…

leetcode.206.反转链表

题目 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 双指针:创建指针p,curr&#xff0c;初始分别指向null和头节点&#xff0c;每轮循环移动一个节点的指向&#xff0c;直到指到最后一…

先登杯·14天创作挑战营·第④期~ 等你来战!

文章目录 ⭐️ 活动介绍⭐️ 活动详情⭐️ 活动奖品⭐️ 活动流程​⭐️ 评审规则⭐️ 报名&投稿注意事项⭐️ 活动组织 ​ 活动报名入口&#xff1a;https://bbs.csdn.net/topics/618374514 本次活动与官方活动及其他博主的创作型活动并不冲突&#xff01; ​ ​ ⭐️…

非conda环境(powershell与cmd)使用opencv-python库

1.安装python 3.11.7 Python Release Python 3.11.7 | Python.org 安装成功后,查看版本为3.11.7 2.安装numpy pip install numpy 3.安装matplotlib pip install matplotlib matplotlib库安装成功

东方博宜 1231. 考试成绩的分布情况

东方博宜 1231. 考试成绩的分布情况 #include<iostream> #include<iomanip> using namespace std; int main() {int n ;cin >> n ;int a[101] ;for(int i 0 ; i < n ; i){cin >> a[i] ;}double sum ;sum 0 ;for(int j 0 ; j < n ; j){sum …

Going deeper with Image Transformers

1、引言 论文链接&#xff1a; https://openaccess.thecvf.com/content/ICCV2021/papers/Touvron_Going_Deeper_With_Image_Transformers_ICCV_2021_paper.pdf 由于目前对图像 Transformer[1] 的优化问题研究很少&#xff0c;Hugo Touvron 等[2] 构建和优化了更深的用于图像分…

03-JAVA设计模式-单例模式详解

单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中的一种&#xff0c;它确保一个类仅有一个实例&#xff0c;并提供一个全局访问点来访问该实例。这种设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 单例模式的应用场景十分广泛…

专题三——二分算法

目录 原理 模板 朴素二分算法 非朴素二分算法 一二分查找 二在排序数组中查找元素的第一个和最后一个位置 三点名 四x的平方根 五搜索插入位置 六山脉数组的峰顶索引 七寻找峰值 八寻找旋转排序数组中的最小值 原理 定义两个指针&#xff1a;left指向数组第一个元…

实景三维在文化旅游领域的应用

实景三维技术&#xff0c;作为一种前沿的科技手段&#xff0c;近年来在文化旅游领域的应用逐渐崭露头角。它能够将真实世界的场景以三维的形式精确呈现&#xff0c;为游客带来身临其境的体验&#xff0c;为文化旅游注入新的活力。本文将探讨实景三维在文化旅游领域的应用及其所…

编程新手必看,学习python中数字数据类型内容(7)

Python中的数字数据类型主要包括以下几种&#xff1a; 整数&#xff08;int&#xff09;&#xff1a;这是最基本的数字类型&#xff0c;用于表示整数值&#xff0c;如1、-5和1000等。在Python中&#xff0c;整数可以处理任意大小的数值&#xff0c;并且支持多种数学运算。 浮点…

Windows与Linux路径分隔符对比及Java代码实战

在Windows中&#xff0c;磁盘中用反斜杠&#xff08;又称为右斜杠&#xff09;\表示路径的分隔。在浏览器中用正斜杠/来表示路径的分隔。 Linux则是统一用/表示路径的分隔的。下面给出Linux中一些常见的路径表示&#xff1a; / 表示根目录./ 表示当前目录…/ 表示上级目录 …