当前位置: 首页 > news >正文

C++vector容器用法详解

一、前言

  • vector 是封装动态数组的顺序容器,连续存储数据,所以我们不仅可以通过迭代器访问存储在 vector 容器中的数据,还能用指向 vector 容器中的数据的常规指针访问数据。这意味着指向 vector 容器中的数据的指针能传递给任何期待指向数组元素的指针的函数。

  • vector 容器的存储是自动管理的,按需扩张收缩。vector 容器通常占用多于静态数组的空间,因为要分配更多内存以管理将来的增长。 vector 容器增长不是在原空间之后接新空间,而是找更大的内存空间,然后将已有数据拷贝到新空间,释放原空间,vector 容器所用的增长方式不是在每次插入元素时,而是在额外空闲内存耗尽时重分配。

  • vector 容器是类模板,可以存储内置数据类型(例如:char,int,float 等),自定义数据类型,也可以 vector 容器嵌套容器。使用时包含头文件 <vector>

template<class T, class Allocator = allocator<T>> 
class vector {// 代码块
};
  • vector 容器的迭代器是支持随机访问的迭代器。例如:

vector<int>::iterator it = v.begin();
cout << *(it + 2) << endl; //访问 v 中下标为 2 的元素

二、 vector 容器类函数

构造函数

vector();

功能:默认构造函数
形数:
返回值:

vector(const vector& right);

功能:拷贝构造函数
形参:
right :另一个 vector 容器对象的常引用
返回值:

vector(iterator first, iterator last);

功能:创建一个vector 容器对象,并将 [first, last) 区间的元素拷贝到这个 vector 容器对象中
形参:
first :起始迭代器
lsat :末尾迭代器(注意:这个末尾迭代器的元素是没有被拷贝到这个 vector 容器对象中的)
返回值:

vector(const size_type count, const T& val);

功能:创建一个 vector 容器对象,并将 count 个 T 类型数据拷贝到这个 vector 容器对象中
形参:
count :数量
val :T类型数据的引用(T是模板参数)
返回值:
vector_constructor.cpp
#include <iostream>
#include <vector>
using namespace std;int main(int argc, char *argv[])
{vector<int> v1; //调用默认构造函数v1.push_back(1);v1.push_back(2);cout << "---- v1 容器 -----" << endl;for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)cout << *it << endl;vector<int> v2(v1); //调用拷贝构造函数cout << "---- v2 容器 -----" << endl;for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)cout << *it << endl;vector<int> v3(v1.begin(), v1.end()); //调用 vector(iterator first, iterator last);cout << "---- v3 容器 -----" << endl;for (vector<int>::iterator it = v3.begin(); it != v3.end(); it++)cout << *it << endl;vector<int> v4(3, 100); //调用 vector(const size_type count, const int& val);cout << "---- v4 容器 -----" << endl;for (vector<int>::iterator it = v4.begin(); it != v4.end(); it++)cout << *it << endl;return 0;
}

迭代器

begin(); cbegin(); //返回指向起始迭代器(cbegin(); C++11标准加入的

end(); cend(); //返回指向末尾的迭代器(cend(); C++11标准加入的

rbegin(); crbegin(); //返回指向起始的逆向迭代器(crbegin(); C++11标准加入的

rend(); crend(); //返回指向末尾的逆向迭代器(crend(); C++11标准加入的

vector_iterator.cpp
#include <iostream>
#include <vector>
using namespace std;int main(int argc, char *argv[])
{vector<int> v;v.push_back(0);v.push_back(1);v.push_back(2);v.push_back(3);cout << "*begin = " << *(v.begin()) << endl;cout << "*cbegin = " << *(v.cbegin()) << endl;cout << "*rbegin = " << *(v.rbegin()) << endl;cout << "*crbegin = " << *(v.crbegin()) << endl;return 0;
}

赋值操作

operator=

vector& operator=(const vector& right);

功能:将右值 right 容器对象中的所有元素赋值给这个 vector 容器对象(左值)
形参:
right :另一个 vector 容器对象的常引用
返回值:被赋值的 vector 容器对象的引用

assign

void assign(iterator first, iterator last);

功能:将 [first, last) 区间的元素赋值给这个 vector 容器对象
形参:
first :起始迭代器
last :末尾迭代器(注意:这个末尾迭代器的元素是没有被赋值给这个 vector 容器对象中的)
返回值:void

void assign(const size_type count, const T& val);

功能:将 count 个 T 类型数据赋值给这个 vector 容器对象
形参:
count :数量
val :T 类型数据的引用(T是模板参数)
返回值:void

vector_assign.cpp

#include <iostream>
#include <vector>
using namespace std;int main(int argc, char *argv[])
{vector<int> v1;v1.push_back(1);v1.push_back(2);cout << "---- v1 容器 ----" << endl;for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)cout << *it << endl;vector<int> v2;v2 = v1; //调用 vector& operator=(const vector& right);cout << "---- v2 容器 ----" << endl;for (vector<int>::iterator it = v2.begin(); it != v2.end(); it++)cout << *it << endl;vector<int> v3;v3.assign(v1.begin(), v1.end()); //调用 void assign(iterator first, iterator last);cout << "---- v3 容器 ----" << endl;for (vector<int>::iterator it = v3.begin(); it != v3.end(); it++)cout << *it << endl;vector<int> v4;v4.assign(3, 100); //调用 void assign(const size_type count, const int& val);for (vector<int>::iterator it = v4.begin(); it != v4.end(); it++)cout << *it << endl;return 0;
}

元素访问

at

T& at(const size_type pos);

功能:访问指定下标的元素,普通对象调用这个函数
形参:
pos :要返回的元素的下标
返回值:指定下标元素的引用

const T& at(const size_type pos) const;

功能:访问指定下标的元素,常对象调用这个函数
形参:
pos :要返回的元素的下标
返回值:指定下标元素的常引用

operator[]

T& operator[](const size_type pos);

功能:访问指定下标的元素,普通对象调用这个函数
形参:
pos :要返回的元素的下标
返回值:指定下标元素的引用

const T& operator[](const size_type pos) const;

功能:访问指定下标的元素,常对象调用这个函数
形参:
pos :要返回的元素的下标
返回值:指定下标元素的常引用

front

T& front();

功能:访问第一个元素,普通对象调用这个函数
形参:
返回值:第一个元素的引用

const T& front() const;

功能:访问第一个元素,常对象调用这个函数
形参:
返回值:第一个元素的常引用

back

T& back();

功能:访问最后一个元素,普通对象调用这个函数
形参:
返回值:最后一个元素的引用

const T& back() const;

功能:访问最后一个元素,常对象调用这个函数
形参:
返回值:最后一个元素的常引用

data

T* data();

功能:返回指向存储元素工作的底层数组的指针,指针满足范围 [data(), data() + size()) 普通对象调用这个函数
形参:
返回值:指向存储元素工作的底层数组的指针

const T* data() const;

功能:返回指向存储元素工作的底层数组的指针,指针满足范围 [data(), data() + size()) 。常对象调用这个函数
形参:
返回值:指向存储元素工作的底层数组的常量指针

vector_visit.cpp

#include <iostream>
#include <vector>
using namespace std;int main(int argc, char *argv[])
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);const vector<int> cv(v);cout << "---- at ----" << endl;cout << "v[0] = " << v.at(0) << endl; //调用 int& at(const size_type pos);//cout << "v[3] = " << v.at(3) << endl; //越界,会报 已放弃(吐核)cout << "cv[2] = " << cv.at(2) << endl; //调用 const int& at(const size_type pos) const;cout << endl;cout << "---- operator[] ----" << endl;cout << "v[0] = " << v[0] << endl; //调用 int& operator[](const size_type pos);//cout << "v[3] = " << v[3] << endl; //越界,会报 已放弃(吐核)cout << "cv[2] = " << cv[2] << endl; //调用 const int& operator[](const size_type pos) const;cout << endl;cout << "---- front ----" << endl;cout << "v 第一个元素 = " << v.front() << endl; //调用 int& front();cout << "cv 第一个元素 = " << v.front() << endl; //调用 const int& front() const;cout << endl;cout << "---- back ----" << endl;cout << "v 最后一个元素 = " << v.back() << endl; //调用 int& back();cout << "cv 最后一个元素 = " << v.back() << endl; //调用 const int& back() const;cout << endl;cout << "---- data ----" << endl;cout << "---- v ----" << endl;for (int *p = v.data(); p < v.data() + v.size(); p++) //调用 int* data();cout << *p << endl;cout << "---- cv ----" << endl;for (const int *p = cv.data(); p < cv.data() + cv.size(); p++) //调用 const int* data() const;cout << *p << endl;return 0;
}

容量

empty

bool empty() const;

功能:判断容器是否为空
形参:
返回值:若容器为空返回 true,否则返回 false

size

size_type size() const;

功能:返回容器中元素个数
形参:
返回值:容器中元素个数

resize

void resize(const size_type newsize);

功能:设置容器的元素个数为 newsize 个
如果 newsize == size(),什么都不做
如果 newsize > size(), 则尾部插入 newsize - size() 个默认的元素(比如 int 元素,默认0)
如果 newsize < size(), 则留下以首元素开始的前 newsize 个元素,后面的都会被擦除掉
形参:
newsize :容器新的元素个数
返回值:

void resize(const size_type newsize, const T& val)

功能:设置容器的元素个数为 newsize 个
如果 newsize == size(),什么都不做
如果 newsize > size(), 则尾部插入 newsize - size() 个值为 val 的元素
如果 newsize < size(), 则留下以首元素开始的前 newsize 个元素,后面的都会被擦除掉
形参:容器新的元素个数
返回值:

max_size

size_type max_size() const;

功能:返回根据系统或库实现限制的容器可存储的元素最大数量
形参:
返回值:根据系统或库实现限制的容器可存储的元素最大数量

reserve

void reserve(const size_type new_capacity);

功能:增加容器的容量到 >= new_capacity;如果 new_capacity 大于当前的 capacity(),则分配新空间,并把原有的元素拷贝到新空间,释放原空间,否则该方法什么也不做
形参:
new_capacity :新容量值
返回值:

capacity

size_type capacity() const;

功能:返回当前存储空间能够容纳的元素个数
形参:
返回值:当前存储空间能够容纳的元素个数

shrink_to_fit

void shrink_to_fit(); (注意:C++11标准加入)

功能:请求移除容器中未使用的容量,请求是否能达成依赖实现
形参:
返回值:

vector_capacity.cpp

#include <iostream>
#include <vector>
using namespace std;#define MAX 4int main(int argc, char *argv[])
{vector<int> v;for (int i = 0; i < MAX; i++)v.push_back(i);vector<int> vm;cout << "---- v ----" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- vm ----" << endl;for (vector<int>::iterator it = vm.begin(); it != vm.end(); it++)cout << *it << " ";cout << endl;cout << endl;cout << "---- empty ----" << endl;if (v.empty())cout << "v is empty." << endl;else cout << "v isn't empty." << endl;if (vm.empty())cout << "vm is empty." << endl;else cout << "vm isn't empty." << endl;cout << endl;cout << "---- max_size ----" << endl;cout << "v max_size = " << v.max_size() << endl;cout << "vm max_size = " << vm.max_size() << endl;cout << endl;cout << "---- size ----" << endl;cout << "v size = " << v.size() << endl;cout << "vm size = " << vm.size() << endl;cout << endl;cout << "---- capacity ----" << endl;cout << "v capacity = " << v.capacity() << endl;cout << "vm capacity = " << vm.capacity() << endl;v.reserve(100);vm.reserve(100);cout << "---- after reserve new capacity 100 ----" << endl;cout << "v capacity = " << v.capacity() << endl;cout << "vm capacity = " << vm.capacity() << endl;v.reserve(50); //比当前 capacity() 小,什么都不做vm.reserve(50); //比当前 capacity() 小,什么都不做cout << "---- after reserve new capacity 50 ----" << endl;cout << "v capacity = " << v.capacity() << endl; cout << "vm capacity = " << vm.capacity() << endl;v.shrink_to_fit();vm.shrink_to_fit();cout << "---- after shrink_to_fit ----" << endl;cout << "v capacity = " << v.capacity() << endl;cout << "vm capacity = " << vm.capacity() << endl;v.resize(8);cout << "----after v.resize(8) v ----" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;vm.resize(8, 10);cout << "----after vm.resize(8, 10) vm ----" << endl;for (vector<int>::iterator it = vm.begin(); it != vm.end(); it++)cout << *it << " ";cout << endl;cout << "---- capacity ----" << endl;cout << "v capacity = " << v.capacity() << endl;cout << "vm capacity = " << vm.capacity() << endl;v.resize(2); //从 8 个元素,resize 到 2 个,会留下从首元素开始的前 2 个元素cout << "----after v.resize(2) v ----" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;vm.resize(2, 5); //从 8 个元素,resize 到 2 个,会留下从首元素开始的前 2 个元素cout << "----after vm.resize(2, 5) vm ----" << endl;for (vector<int>::iterator it = vm.begin(); it != vm.end(); it++)cout << *it << " ";cout << endl;cout << "---- capacity ----" << endl;cout << "v capacity = " << v.capacity() << endl;cout << "vm capacity = " << vm.capacity() << endl;return 0;
}

操作

push_back

void push_back(const T& val);

功能:添加数据到容器末尾
形参:
val :T 类型数据的常引用(T 是模板参数)
返回值:

pop_back

void pop_back();

功能:删除容器的末元素
形参:
返回值:

clear

void clear();

功能:清空容器所有元素。调用这个函数后 size() 返回 0
形参:
返回值:

erase

iterator erase(iterator pos); //C++11标准前

iterator erase(const_iterator pos); //C++11 标准起

功能:删除位于 pos 位置的元素
形参:
pos :指向要删除元素的迭代器
返回值:后随被删除元素的迭代器
1. 如果 pos 指向末元素,则返回 end() 迭代器
2. 如果删除不存在的元素,会报段错误

iterator erase(iterator first, iterator last); //C++11 标准前

iterator erase( const_iterator first, const_iterator last ); //C++11 标准起

功能:删除位于 [first, last) 区间的元素
形参:
first :要删除元素区间的起始迭代器
last :要删除元素区间的末尾迭代器
返回值:后随最后被删除元素的迭代器
1. 如果 last == end(),则返回更新后的 end() 迭代器
2. 如果 [first, last) 为空范围,则返回 last 迭代器

iterator insert(iterator pos, const T& val);

功能:在 pos 位置前插入元素

void insert(iterator pos, size_type count, const T& val);

功能:在 pos 位置前插入 count 个 val

void insert(iterator pos, InputIt first, InputIt last);

功能:在 pos 位置 插入 [first, last) 区间的所有元素

void swap(vector& right);

功能:将容器的内容与 right 的交换

vector_operate.cpp

#include <iostream>
#include <vector>
using namespace std;#define MAX 4int main(int argc, char *argv[])
{vector<int> v;cout << "---- push_back v ----" << endl;for (int i = 0; i < MAX; i++){v.push_back(i+1); //调用 void push_back(const T& val);cout << v[i] << " ";}cout << endl;cout << "---- after v.pop_back() v ----" << endl;v.pop_back(); //调用 void pop_back();for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- erase ----" << endl;vector<int>::iterator eraseIt = v.begin() + 1;v.erase(eraseIt); //调用 iterator erase(iterator pos);cout << "---- after erase(v.begin() + 1) v ----" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;//v.erase(v.end()); 删除不存在的元素,报段错误cout << "---- after erase(v.begin(), v.end()) v ---- "  << endl;v.erase(v.begin(), v.end()); //调用 iterator erase(iterator first, iterator last);for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- after insert(v.begin(), 1) v ----" << endl;v.insert(v.begin(), 1); // iterator insert(iterator pos, const T& val);for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- after insert(v.end(), 2) v ----" << endl;v.insert(v.end(), 2); // iterator insert(iterator pos, const T& val); for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- after insert(v.end(), 5, 100) v ----" << endl;v.insert(v.end(), 5, 100); // void insert(iterator pos, size_type count, const T& val);for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- after insert(v.end(), v.begin(), v.end()) v ----" << endl;v.insert(v.end(), v.begin(), v.end()); // void insert(iterator pos, InputIt first, InputIt last);for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- swap ----" << endl;vector<int> v1;for (int i = 0; i < MAX; i++)v1.push_back(i+1);cout << "---- before swap v1----" << endl;for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)cout << *it << " ";cout << endl;v.swap(v1); // cout << "---- after swap v----" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;cout << "---- after swap v1----" << endl;for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)cout << *it << " ";cout << endl;v.clear(); // void clear();cout << "---- after clear() v----" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++)cout << *it << " ";cout << endl;return 0;
}

三、vector 容器存储自定义数据

假如,我们有一个自定义的 People 类,这个类中有两个公共数据,分别是名字和年龄,有多个人的数据,需要存储在 vector 容器中,示例如下:

vector_udt.cpp
#include <iostream>
#include <string>
#include <vector>
using namespace std;class People
{public:People(const string name, const int age):m_name(name), m_age(age){}string m_name;int m_age;
};int main(int argc, char *argv[])
{People p1("a", 10);People p2("b", 20);People p3("c", 30);People p4("d", 40);People p5("e", 50);vector<People> v;v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);for (vector<People>::iterator it = v.begin(); it != v.end(); it++)cout << "name = " << it->m_name << ", age = " << it->m_age << endl;return 0;
}

四、vector 容器嵌套容器

vector 容器嵌套 vector 容器,其实就是二维数组

vector_dim.cpp
#include <iostream>
#include <vector>
using namespace std;int main(int argc, char *argv[])
{vector<vector<int> > vv;vector<int> v1;vector<int> v2;vector<int> v3;vector<int> v4;for (int i = 0; i < 4; i++){v1.push_back(i+1);v2.push_back(i+2);v3.push_back(i+3);v4.push_back(i+4);}vv.push_back(v1);vv.push_back(v2);vv.push_back(v3);vv.push_back(v4);for (vector<vector<int> >::iterator itvv = vv.begin(); itvv != vv.end(); itvv++){for (vector<int>::iterator it = itvv->begin(); it != itvv->end(); it++)cout << *it << " ";cout << endl;}return 0;
}

五、循环访问 vector 容器的三种方式(while,for,for_each)

while

依据迭代器

vector<T>::iterator itBegin = v.begin();
vector<T>::iterator itEnd = v.end();
while(itBegin != itEnd)
{//代码块itBegin++;
}

for

依据迭代器

for (vector<T>::iterator it = v.begin(); it != v.end(); it++)
{//代码块
}

for_each

依据头文件 <algorithm> 中提供的 for_each 函数

void func_callback(const T &val) //回调函数
{//代码块
}
for_each(v.begin(), v.end(), my_print);
vector_loop.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;void my_print(const int &val)
{cout << val << endl;
}int main(int argc, char *argv[])
{vector<int> v;for (int i = 0; i < 5; i++)v.push_back(i);cout << "---while print----" << endl;vector<int>::iterator itBegin = v.begin();vector<int>::iterator itEnd = v.end();while(itBegin != itEnd){cout << *itBegin << endl;itBegin++;}cout << "----for print----" << endl;for (vector<int>::iterator it = v.begin(); it != v.end(); it++){cout << *it << endl;}cout << "----for_each----" << endl;for_each(v.begin(), v.end(), my_print);return 0;
}

相关文章:

C++vector容器用法详解

一、前言vector 是封装动态数组的顺序容器&#xff0c;连续存储数据&#xff0c;所以我们不仅可以通过迭代器访问存储在 vector 容器中的数据&#xff0c;还能用指向 vector 容器中的数据的常规指针访问数据。这意味着指向 vector 容器中的数据的指针能传递给任何期待指向数组元…...

Log4j2的Loggers详解

引言 官方配置文档&#xff1a;https://logging.apache.org/log4j/2.x/manual/filters.html Loggers节点 Loggers节点常见的有两种:Root和Logger <Loggers><Logger name"org.apache.logging.log4j.core.appender.db" level"debug" additivity&qu…...

计算机视觉的应用1-OCR分栏识别:两栏识别三栏识别都可以,本地部署完美拼接

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来OCR的分栏识别。 一、文本分栏的问题 在OCR识别过程中&#xff0c;遇到文字是两个分栏的情况确实是一个比较常见的问题。通常情况下&#xff0c;OCR引擎会将文本按照从左到右&#xff0c;从上到下的顺序一行一行地识别…...

低代码平台如何选型, 43款国内外低代码平台一网打尽

目前&#xff0c;零代码技术和低代码技术越来越成熟&#xff0c;低代码平台也越来越被大家所接受&#xff0c;国内低代码平台厂商和产品层出不穷&#xff0c;到底哪家低代码平台好&#xff0c;企业如何选型&#xff0c;以下给出一些参考。 一、低代码平台如何选型 企业如何选…...

第六周作业(1.5小时)

一、PreparedStatement PreparedStatement也可以用来执行sql语句&#xff0c;但是需要注意&#xff1a;它需要用sql创建好PreparedStatement&#xff0c;而Statement不需要用sql来创建。 优点&#xff1a; 1、具有较好的可维护性和可读性&#xff0c;参数的分别插入减少了错…...

排序 (蓝桥杯) JAVA

目录题目描述&#xff1a;冒泡排序算法(排序数字&#xff0c;字符)&#xff1a;String与String buffer的区别:纯暴力破解(T到爆炸)&#xff1a;暴力破解加思考(bingo)&#xff1a;总结&#xff1a;题目描述&#xff1a; 小蓝最近学习了一些排序算法&#xff0c;其中冒泡排序让他…...

【Blender 水墨材质】实现过程剖析01

写在前面 想把Blender一位大佬演示的Blender水墨材质过程&#xff0c;在Unity用Shader重现&#xff0c;过程中会拿能拿到的节点代码举例&#xff08;ShaderGraph或者UE的都会有&#xff09;。第一步当然是要跟着人家做一遍&#xff01;我会尽可能地分析一下每一步的原理~ 教程…...

代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72. 编辑距离

​ LeetCode 583 两个字符串的删除操作 题目链接&#xff1a;https://leetcode.cn/problems/delete-operation-for-two-strings/ 思路&#xff1a; 方法一:两个子串同时删除元素 dp数组的含义 dp[i][j]dp[i][j]dp[i][j]代表以i-1为结尾的字符串word1&#xff0c;和以j-1位结…...

【ArchLinux】【KDE】Archlinux的安装与使用

文章目录开头前言所需环境演示环境相关链接安装教程在Windows环境下制作启动盘进入ArchLinux Live环境安装为硬盘分区如何新建分区&#xff1f;分区表格式化分区分区完成&#xff0c;开始安装挂载分区切换镜像源安装基本系统设置将Live环境&#xff08;当前&#xff09;挂载信息…...

Go语言精修(尚硅谷笔记)第六章

六、函数、包和错误处理 6.1 函数概念 不用函数的弊端 1&#xff09;写法可以完成功能, 但是代码冗余 2 ) 同时不利于代码维护 概念&#xff1a;为完成某一功能的程序指令(语句)的集合,称为函数。 在Go中,函数分为: 自定义函数、系统函数 基本语法 //函数的基本语法 fu…...

Photoshop的功能

Photoshop是一款功能强大的图片编辑软件&#xff0c;它提供了数百种不同的工具和特效&#xff0c;让您可以编辑图片、创建图形和设计网页等。 以下是Photoshop的一些主要功能&#xff1a; 1.图层&#xff1a;Photoshop允许您创建多个图层&#xff0c;让您可以在每一个图层上进…...

C++初阶——内存管理

目录 1. C/C内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 重要 4.1 operator new与operator delete函数&#xff08…...

uds服务汇总

还有一些服务列举在下面&#xff1a; RequestDownload&#xff08;服务ID为0x34&#xff09;和RequestUpload&#xff08;服务ID为0x35&#xff09;&#xff1a;这两个服务用于在ECU和诊断器之间进行数据传输。通过 RequestDownload服务&#xff0c;诊断器可以请求ECU接收一些数…...

【深度学习】2023李宏毅homework1作业一代码详解

研一刚入门深度学习的小白一枚&#xff0c;想记录自己学习代码的经过&#xff0c;理解每行代码的意思&#xff0c;这样整理方便日后复习也方便理清自己的思路。感觉每天时间都不够用了&#xff01;&#xff01;加油啦。 第一部分&#xff1a;导入模块 导入各个模块&#xff0…...

【软件测试】基础知识第二篇

文章目录一. 开发模型1. 瀑布模型2. 螺旋模型3. 增量和迭代模型3.1 增量模型3.2 迭代模型3.3 增量和迭代模型的区别4. 敏捷模型4.1 敏捷宣言4.2 scrum模型二. 开发模型V 模型W 模型一. 开发模型 1. 瀑布模型 瀑布模型在软件工程中占有重要地位&#xff0c;是所有其他模型的基…...

Java中File类以及初步认识流

1、File类操作文件或目录属性 &#xff08;1&#xff09;在Java程序中通过使用java.io包提供的一些接口和类&#xff0c;对计算机中的文件进行基本的操作&#xff0c;包括对文件和目录属性的操作、对文件读写的操作&#xff1b; &#xff08;2&#xff09;File对象既可以表示…...

【C语言】文件操作详细讲解

本章要分享的内容是C语言中文件操作的内容&#xff0c;为了方便大家学习&#xff0c;目录如下 目录 1.为什么要使用文件 2.什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3.文件的打开和关闭 3.1文件指针 3.2打开和关闭 4.文件的顺序读写 4.1顺序读写函数介绍…...

爱奇艺万能联播使用教程

众所周知&#xff0c;爱奇艺是百度旗下的一款产品&#xff0c;所以今天用爱奇艺万能联播的方法实现下载百度网盘&#xff0c;并没有破解百度网盘&#xff0c;是官方正版下载渠道。软件是官方版本&#xff0c;大家双击安装即可。 安装完成以后&#xff0c;在软件中就有了“访问网…...

真题讲解-软件设计(三十七)

数据流图DFD&#xff08;真题讲解&#xff09;-软件设计&#xff08;三十六&#xff09;https://blog.csdn.net/ke1ying/article/details/129803164 在网络安全管理中&#xff0c;加强内防内控可采取的策略是&#xff1f; 终端访问权限&#xff0c;防止合法终端越权访问。加强…...

Android 上的协程(第一部分):了解背景

本系列文章 Android 上的协程&#xff08;第一部分&#xff09;&#xff1a;了解背景 Android 上的协程&#xff08;第二部分&#xff09;&#xff1a;入门 Android上的协程 (第三部分): 实际应用 Android 上的协程&#xff08;第一部分&#xff09;&#xff1a;了解背景 这篇…...

【H3C】VRRP2 及Vrrp3基本原理 华为同用

文章目录VRRP2基本概念报文格式主备选举规则&#xff08;优先级&#xff09;0和255双Master原因VRRP认证VRRP状态机抢占模式VRRP主备切换状态项目场景VRRP3H3C参考致谢VRRP2 基本概念 VRRP路由器&#xff08;VRRP Router&#xff09;&#xff1a;运行VRRP的设备&#xff0c;它…...

【数据库】SQL语法

目录 1. 常用数据类型 2. 约束 3. 数据库操作 4. 数据表操作 查看表 创建表格 添加数据 删除数据 修改数据 单表查询数据 多表查询数据 模糊查询 关联查询 连接查询 数据查询的执行顺序 4. 内置函数 1. 常用数据类型 整型&#xff1a;int浮点型&#xff1a;flo…...

JavaEE简单示例——文件的上传和下载

文件的上传和下载的实现原理的简单介绍 表单的构成 首先,我们先来介绍我们的需要用到的表单,在这个表单中,首先值得我们注意的就是,在type为file的input标签中.这个控件是我们主要用来选择上传的文件的, 除此之外,我们要想实现文件的上传,还需要将method的属性的值设置为post…...

【C语言督学训练营 第五天】数组字符串相关知识

文章目录前言一、数组的定义1.一维数组①.如何定义②.声明规则③.内存分布④.初始化方法2.二维数组3.高维数组二、访问数组元素相关问题1.访问越界2.数组的传递三、Scanf与字符数组1.字符数组初始化2.scanf读取字符四、字符数组相关函数前言 今天的C语言训练营没有安排高维数组…...

GPT-4 免费体验方法

POE 在Quora上非常受欢迎的手机聊天机器人Poe App已经集成ChatGPT助手&#xff01;除了最初集成的三个聊天机器人Sage、Claude和Dragonfly外&#xff0c;Poe现在还加入了第四位ChatGPT。由于使用了ChatGPT API&#xff0c;因此Poe拥有真正的ChatGPT。 现在更是第一批集成了GP…...

中断-屏蔽位

1.中断控制器(PIC:适用于单处理器、APIC) 1.定义 中断控制器可以看作是中断服务的代理,外设五花八门,如果没有一个中断的代理,外设想要给cpu发送中断信号来处理中断。那么只能是外设连接在cpu引脚上,由于cpu引脚很宝贵,所以不可能拿出那么多引脚来供外设连接,所以就有…...

【洛谷P1636】 Einstein学画画

题目描述&#xff1a;Einstein 学起了画画。此人比较懒~~&#xff0c;他希望用最少的笔画画出一张画……给定一个无向图&#xff0c;包含 n 个顶点&#xff08;编号 1∼n&#xff09;&#xff0c;m 条边&#xff0c;求最少用多少笔可以画出图中所有的边。输入格式第一行两个整数…...

户外LED显示屏钢结构制作原则

户外LED显示屏在施工安装时是必须要制作固定钢结构的&#xff0c;因为户外LED显示屏工作环境相对比较恶劣&#xff0c;制作钢结构一是为了安全&#xff0c;二是为了提高防护等级。那么户外LED显示屏钢结构制作原则是什么呢&#xff1f;迈普光彩小编总结了一些分享个大家。 户外…...

【内网穿透】使用Haproxy反向代理搭建企业私有云:神卓互联教程

神卓互联是一款强大的内网穿透工具&#xff0c;可以帮助企业搭建私有云&#xff0c;实现对内部资源的远程访问。在搭建私有云的过程中&#xff0c;使用HAProxy反向代理可以提高系统的性能和可靠性。本文将介绍如何使用神卓互联和HAProxy反向代理搭建私有云。 步骤如下&#xf…...

spring boot项目:实现与数据库的连接

步骤【写在前面】定义数据库连接信息&#xff1a;引入数据库驱动&#xff1a;创建数据源&#xff1a;创建JdbcTemplate&#xff1a;编写DAO层&#xff1a;使用Service注解标注Service层&#xff1a;使用RestController注解标注Controller层&#xff1a;示例代码&#xff1a;app…...