【C++】vector(上):vector的常用接口介绍
文章目录
- 前言
- 一、vector的介绍
- 二、vector的常用接口介绍
- 1.vector类对象的常见构造
- 2.vector iterator 的使用
- 3.vector类对象的容量操作
- 3.1 size、capacity 和 empty的使用
- 3.2 reserve的使用
- 3.3 resize的使用
- 4.vector类对象的访问(包含data:返回底层数组的指针)
- 5.vector类对象的修改操作
- 5.1 push_back、insert(插入数据)
- 5.2 pop_back、erase 和 clear(删除数据)
- 5.3 成员函数swap
- 6.vector类非成员函数
- 6.1 relational operators系列函数
- 6.2 非成员函数swap
前言
一、vector的介绍(包含vector类中typedef的部分类型别名介绍)
二、vector类的常用接口说明(vector类对象的 常见构造(重点)、容量操作、遍历操作 和 修改操作等接口,以及一些vector类非成员函数的接口)
一、vector的介绍
C++标准模板库中的容器vector是一个动态数组,能够自动管理内存,支持快速随机访问。 它的接口包括构造函数、大小和容量相关的操作、元素访问方法、修改容器的操作,还有迭代器相关的函数。
在C++标准库的 std::vector 中,allocator(内存分配器)是模板的第二个参数,通常可以忽略,使用默认的即可。但在需要特殊内存管理时,可以自定义allocator,不过这种情况相对少见。
默认内存分配器已足够高效,自定义内存分配器应仅在性能分析表明有必要时才会使用,所以后续介绍vector接口时,只会考虑大多数情况,忽略allocator(直接使用默认的)这个参数,简化vector的使用。
vector 类中typedef了很多类型别名,以下代码展示了一些常用的类型别名:
typedef T value_type;// 其中 T 是 vector 的第一个模板参数
typedef size_t size_type;
// size_t 是 C++ 标准库中定义的一个类型别名,它通常是一个无符号整数类型。其可能的定义方式如下:
// 64 位系统下: typedef unsigned long long size_t;
// 32 位系统下: typedef unsigned int size_t;
typedef T& reference;
typedef const T& const_reference;
typedef Allocator allocator_type;
二、vector的常用接口介绍
1.vector类对象的常见构造
忽略allocator相关参数后的简化接口:
(constructor)构造函数声明 | 接口说明 |
---|---|
vector() | 无参构造,默认构造空容器 |
vector( size_type n, const value_type& val =value_type() ) | 构造并初始化n个val |
template< class InputIterator > vector ( InputIterator first, InputIterator last ) | 使用迭代器进行初始化构造 |
vector (const vector& x) | 拷贝构造 |
vector ( initializer_list<value_type> il ) | 初始化列表构造(C++11新增,了解用法) |
示例一(无参构造,默认构造空容器):
vector( );
#include <vector>
using namespace std;int main()
{vector<int> app;// size和capacity均为0return 0;
}
示例二(构造并初始化n个val):
vector( size_t n, const T& val = T( ) );
#include <vector>
#include <string>
using namespace std;int main()
{vector<int> a1(5); // vector(size_t n, const int& val =int())vector<int*> a2(5); // vector(size_t n, const int*& val =int*())vector<int> a3(5, 10);vector<string> a4(5); // vector(size_t n, const string& val =string())vector<string> a5(5,"abcd");return 0;
}
补充:
(1)规定 int()、char() 等内置类型创建的匿名对象(不传参数时)默认为 0 ; int * ()、char * () 等默认为 nullptr
(2)string() 等自定义类型创建的匿名对象(不传参数时)会去调用对应的默认构造函数
示例三(使用迭代器进行初始化构造):
template< class InputIterator >
vector ( InputIterator first, InputIterator last );
#include <vector>
#include <list>
using namespace std;int main()
{list<int> lst = { 1, 2, 3, 4, 5 }; // 初始化列表的构造方式vector<int> vec1(lst.begin(), lst.end()); // list的迭代器是双向迭代器int arr[] = { 4, 5, 6, 7, 8, 9 };vector<int> vec2(arr + 2, arr + 5); // 指针作为随机访问迭代器vector<int> vec = { 10, 11, 12, 13, 14, 15 };vector<int> vec3(vec.begin() + 1, vec.end() - 2); // vector的迭代器是随机访问迭代器return 0;
}
补充知识(迭代器的种类):
在 C++ 中,迭代器(Iterator)是用于遍历容器(如
vector
、list
、map
等)中元素的对象,类似于指针的行为。根据功能强弱,迭代器分为以下 5 种类别,支持不同的操作:(1). 输入迭代器(Input Iterator)
- 功能:只能单向移动(向前),且只能读取元素(不可修改)。
- 支持的操作:
++
(前置/后置递增)、*
(解引用)、==
/!=
(比较)。- 典型应用:一次性遍历(如从文件流读取数据)。
- 示例:
istream_iterator
(用于输入流)。(2). 输出迭代器(Output Iterator)
- 功能:只能单向移动(向前),且只能写入元素(不可读取)。
- 支持的操作:
++
(前置/后置递增)、*
(解引用赋值)。- 典型应用:向容器或流中写入数据。
- 示例:
ostream_iterator
(用于输出流)。(3). 前向迭代器(Forward Iterator)
- 功能:继承自输入迭代器,支持多次读写和重复遍历。
- 支持的操作:所有输入迭代器的操作,且可以多次递增。
- 典型容器:单链表(如
forward_list
)、哈希表(如unordered_set
)。(4). 双向迭代器(Bidirectional Iterator)
- 功能:继承自前向迭代器,支持双向移动(向前和向后)。
- 支持的操作:所有前向迭代器的操作,新增
--
(前置/后置递减)。- 典型容器:双链表(如
list
)、关联容器(如set
、map
)。(5). 随机访问迭代器(Random Access Iterator)
- 功能:功能最强,支持直接跳跃访问任意位置。
- 支持的操作:所有双向迭代器的操作,新增:
+
/-
、+=
/-=
(跳跃多个位置)。[]
(下标访问)、比较大小(如<
,>
)。- 典型容器:连续内存容器(如
string
、vector
、deque
、数组)。
迭代器关系图示
输入迭代器 → 前向迭代器 → 双向迭代器 → 随机访问迭代器(功能由低到高)
输出迭代器(独立分支)
关键区别
- 随机访问迭代器效率最高(如
vector
的迭代器)。- 输入迭代器是等级最低的迭代器,所有更高级的迭代器(如前向、双向、随机访问迭代器)都兼容输入迭代器的功能。
- 双向迭代器仅支持逐步移动(如
list
)。- 算法需根据迭代器类型选择实现(如 算法库中的
sort
需要随机访问,而list
的双向迭代器不能满足sort
随机访问的要求,所以list
需用自己的sort
方法)。
示例四(拷贝构造):
vector (const vector& x);
#include <vector>
using namespace std;int main()
{vector<int> vec = { 10, 11, 12, 13, 14, 15 }; vector<int> vec1(vec); // 用vec拷贝构造vec1return 0;
}
示例五(初始化列表构造):
vector ( initializer_list< T > il );
#include <vector>
#include <string>
using namespace std;int main()
{vector<int> vec1{ 1, 2, 3 }; // 调用初始化列表构造vector对象时要使用花括号vector<string> vec2{ "hello", "world" };vector<int> vec3 = { 5, 6, 7 };return 0;
}
2.vector iterator 的使用
接口 | 功能 |
---|---|
begin | 获取第一个数据位置的iterator/const_iterator |
end | 获取最后一个数据的下一个位置的iterator/const_iterator |
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> s1 = { 1,3,5,7,9 };vector<int>::iterator it1 = s1.begin();// 普通vector对象调用 iterator begin();// 返回指向vector对象中第一个元素的普通迭代器,允许修改vector对象中的元素while (it1 != s1.end()){(*it1)++;cout << *it1 << ' ';++it1;}cout << endl;const vector<int> s2 = { 1,3,5,7,9 };vector<int>::const_iterator it2 = s2.begin();// const vector对象调用 const_iterator begin() const;// 返回指向const vector对象第一个元素的const迭代器,只允许读取const vector对象中的元素,不能修改while (it2 != s2.end()){cout << *it2 << ' ';++it2;}cout << endl;return 0;
}
3.vector类对象的容量操作
3.1 size、capacity 和 empty的使用
接口 | 功能 |
---|---|
size | 获取数据个数 |
capacity | 获取容量大小 |
empty | 判断是否为空 |
(1)size 和 capacity
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> vec1{ 1,2,3,4,5 };cout << "vec1的有效数据个数:" << vec1.size() << endl;cout << "vec1的容量:" << vec1.capacity() << endl;vector<int> vec2{ 6,6,6,6,6,6,6,6,6,6,6};cout << "vec2的有效数据个数:" << vec2.size() << endl;cout << "vec2的容量:" << vec2.capacity() << endl;return 0;
}
(2)empty
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> vec1{ 1,2,3,4,5 };cout << "vec1是否为空:" << vec1.empty() << endl;vector<int> vec2;cout << "vec2是否为空:" << vec2.empty() << endl;return 0;
}
3.2 reserve的使用
std::vector 类提供的 reserve() 成员函数,用于请求vector对象的容量调整。
注:这个函数不会改变vector对象的有效数据个数,也不会修改vector对象有效数据中的内容。
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9 };cout << "v1的有效数据个数:" << v1.size() << endl;cout << "v1的容量:" << v1.capacity() << endl;v1.reserve(50);cout << "v1的有效数据个数:" << v1.size() << endl;cout << "v1的容量:" << v1.capacity() << endl;return 0;
}
我们一般只用reserve函数进行扩容,使用场景如下:在你预先知道vector对象将增长到某个大小时,可以使用reserve函数提前分配足够的空间,避免频繁扩容。
3.3 resize的使用
std::vector类提供的 resize() 成员函数,用于改变有效数据个数。
如果新的个数大于当前个数,会新增有效数据个数,新增元素初始化为 val;如果新的个数小于当前个数,减少有效数据个数。
示例一(新的个数大于当前个数,会新增有效数据个数,新增元素初始化为 val):
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,2,3 };cout << "v1的有效字符长度:" << v1.size() << endl;cout << "v1的容量:" << v1.capacity() << endl;v1.resize(5, 10);cout << "v1的有效字符长度:" << v1.size() << endl;cout << "v1的容量:" << v1.capacity() << endl;v1.resize(10, 100);cout << "v1的有效字符长度:" << v1.size() << endl;cout << "v1的容量:" << v1.capacity() << endl;return 0;
}
示例二(新的个数小于当前个数,减少有效数据个数):
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9 };cout << "v1的有效字符长度:" << v1.size() << endl;cout << "v1的容量:" << v1.capacity() << endl;v1.resize(5);cout << '\n' << "v1的有效字符长度:" << v1.size() << endl;cout << "v1的容量:" << v1.capacity() << endl;return 0;
}
4.vector类对象的访问(包含data:返回底层数组的指针)
接口 | 功能 |
---|---|
operator[] | 返回n位置的数据(越界访问的情况是不确定的) |
at() | 返回n位置的数据(越界访问会抛异常) |
data() | 返回底层数组的指针(C++11) |
(1)operator[]
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{1,2,3,4,5,6,7,8,9};for (size_t i = 0; i < v1.size(); ++i){v1[i] += 1;cout << v1[i] << ' ';// 普通对象调用 int& operator[](size_t n); // 返回vector对象中指定位置数据的引用(int&),// 这意味着你可以通过返回的引用修改数据的内容。}cout << endl;const vector<int> v2{ 1,2,3,4,5,6,7,8,9 };for (size_t i = 0; i < v2.size(); ++i){cout << v2[i] << ' ';// const对象调用 const int& operator[](size_t n) const; // 返回vector对象中指定位置数据的常引用(const int&),// 这意味着你只能读取vector对象中的数据,而无法进行修改。}cout << endl;return 0;
}
(2)at( )
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{1,2,3,4,5,6,7,8,9};for (size_t i = 0; i < v1.size(); ++i){v1.at(i) += 1;cout << v1.at(i) << ' ';// 普通对象调用 int& at(size_t n); // 返回vector对象中指定位置数据的引用(int&),// 这意味着你可以通过返回的引用修改数据的内容。}cout << endl;const vector<int> v2{ 1,2,3,4,5,6,7,8,9 };for (size_t i = 0; i < v2.size(); ++i){cout << v2.at(i) << ' ';// const对象调用 const int& at(size_t n) const; // 返回vector对象中指定位置数据的常引用(const int&),// 这意味着你只能读取vector对象中的数据,而无法进行修改。}cout << endl;return 0;
}
(3)data( )
#include <vector>
#include <iostream>
using namespace std;int main()
{std::vector<int> myvector(5, 10);cout << "myvector contains:";for (unsigned i = 0; i < myvector.size(); ++i){cout << ' ' << myvector[i];}cout << '\n';int* p = myvector.data();*p = 20;++p;*p += 20;p[2] = 100;cout << "myvector contains:";for (unsigned i = 0; i < myvector.size(); ++i){ cout << ' ' << myvector[i];}cout << '\n';return 0;
}
5.vector类对象的修改操作
5.1 push_back、insert(插入数据)
接口 | 功能 |
---|---|
push_back | 在末尾插入一个元素 |
insert | 在迭代器 position 位置插入元素 |
(1)push_back
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,1,1,1,1,1,1,1 };for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';v1.push_back(100); // 尾插一个元素for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';return 0;
}
(2)insert
示例一(插入多个相同元素):
iterator insert(const_iterator pos, size_t count, const T& val);
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,1,1,1,1,1,1,1 };for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';v1.insert(v1.begin() + 5, 3, 10);for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';return 0;
}
示例二(插入范围元素):
template < class InputIterator >
iterator insert(const_iterator pos, InputIterator first, InputIterator last);
#include <vector>
#include <list>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,1,1,1,1,1,1,1 };for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';list<int> lst{ 10,11,12,13,14,15 };v1.insert(v1.begin() + 5, lst.begin(), lst.end()); // list的迭代器是双向迭代器for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';return 0;
}
示例三(插入初始化列表):
iterator insert(const_iterator pos, initializer_list< T > il);
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,1,1,1,1,1,1,1 };for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';v1.insert(v1.begin() + 5, { 9,5,2,7 }); // 插入初始化列表for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';return 0;
}
5.2 pop_back、erase 和 clear(删除数据)
接口 | 功能 |
---|---|
pop_back | 删除末尾元素 |
erase | 删除迭代器 pos 指向的元素 |
clear | 清空所有有效元素(不释放内存) |
(1)pop_back
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9 };for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';v1.pop_back();for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';return 0;
}
(2)erase
示例一(删除单个元素):
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9 };for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';v1.erase(v1.begin() + 5); // 删除第6个元素for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';return 0;
}
示例二(删除范围元素):
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9 };for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';v1.erase(v1.begin() + 5, v1.end() - 1); //删除第6~8的元素for (unsigned i = 0; i < v1.size(); ++i){cout << ' ' << v1[i];}cout << '\n';return 0;
}
(3)clear
#include <vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9 };v1.clear();return 0;
}
5.3 成员函数swap
swap成员函数是用于高效交换两个vector对象的内容的函数
#include <vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3};vector<int> v2{ 10,20,30,40 };v1.swap(v2);return 0;
}
6.vector类非成员函数
6.1 relational operators系列函数
#include <vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3 };vector<int> v2{ 1,2,3,4 };vector<int> v3{ 1,3,2 };// == 运算符:元素数量相同且对应元素相等bool b1 = (v1 == v2); // false(元素数量不同)// != 运算符:存在至少一个不相等元素bool b2 = (v1 != v3); // true(在第二个元素 2 != 3)// < 运算符:字典序比较,遇到第一个不同元素时判断bool b3 = (v1 < v2); // true(v1是v2的前缀)bool b4 = (v1 < v3); // true(在第二个元素 2 < 3)// > 运算符:字典序更大bool b5 = (v2 > v3); // false(在第二个元素 2 < 3)return 0;
}
核心原理:
字典序比较:
- 逐个元素对比,直到发现不相等的元素
- 若一个vector是另一个的前缀,较短的vector更小
- 元素必须支持
operator<
(自定义类型需重载)类型一致性:
- 只能比较相同类型的vector(
vector<int>
不能与vector<double>
比较)
6.2 非成员函数swap
std::vector的非成员函数swap专门用于交换两个同类型std::vector对象。它底层实际上调用了std::string的swap成员函数。
它在功能上与std::vector的swap成员函数完全一致,但其提供了更为通用的接口。
#include <vector>
using namespace std;int main()
{vector<int> v1{ 1,2,3};vector<int> v2{ 10,20,30,40 };swap(v1, v2); // 功能上与std::vector的swap成员函数完全一致,但其提供了更为通用的接口return 0;
}
相关文章:

【C++】vector(上):vector的常用接口介绍
文章目录 前言一、vector的介绍二、vector的常用接口介绍1.vector类对象的常见构造2.vector iterator 的使用3.vector类对象的容量操作3.1 size、capacity 和 empty的使用3.2 reserve的使用3.3 resize的使用 4.vector类对象的访问(包含data:返回底层数组…...

【算法】二分查找(上)
目录 一、写好二分查找的四个步骤 二、在排序数组中查找元素的第一个和最后一个位置 三、搜索插入位置 四、x的平方根 通过上篇文章【手撕二分查找】,我们知道了二分查找的【四要素】:初始值、循环条件、mid的计算方式、左右边界更新语句。 循环条件…...

【人工智能】GPT-4 vs DeepSeek-R1:谁主导了2025年的AI技术竞争?
前言 2025年,人工智能技术将迎来更加激烈的竞争。随着OpenAI的GPT-4和中国初创公司DeepSeek的DeepSeek-R1在全球范围内崭露头角,AI技术的竞争格局开始发生变化。这篇文章将详细对比这两款AI模型,从技术背景、应用领域、性能、成本效益等多个方…...

linux nginx 安装后,发现SSL模块未安装,如何处理?
?? 主页: ?? 感谢各位大佬 点赞?? 收藏 留言?? 加关注! ?? 收录于专栏:运维工程师 文章目录 前言SSL模块安装 前言 nginx 安装后,发现SSL模块未安装,如果不需要配置SSL域名,就无关紧要。但是很多时候客户后…...

蓝桥杯 - 每日打卡(类斐波那契循环数)
题目: 解题思路: 假设输入数值为number 分析题目,如果想要解决这个问题,我们需要实现两个方法,第一个检查number是否是类斐波那契,第二个是模拟1e7 - 0的过程,因为是求最大的,那么我们从1e7开始…...

深入探索C++17文件系统库:std::filesystem全面解析
前言 在C编程中,文件系统操作是许多应用程序的基础功能之一。无论是读写文件、创建目录,还是遍历文件系统,文件系统操作几乎无处不在。然而,在C17之前,标准库并没有提供一个统一、高效且易用的文件系统操作接口。开发…...

LLM | 论文精读 | GIS Copilot : 面向空间分析的自主GIS代理
论文标题:GIS Copilot: Towards an Autonomous GIS Agent for Spatial Analysis 作者:Temitope Akinboyewa,Zhenlong Li,Huan Ning,M. Naser Lessani等 来源:arXiv DOI:10.48550/arXiv.2411.…...

Unity 适用Canvas 为任一渲染模式的UI 拖拽
RectTransformUtility-ScreenPointToWorldPointInRectangle - Unity 脚本 API 将一个屏幕空间点转换为世界空间中位于给定RectTransform 平面上的一个位置。 实现 获取平面位置。 parentRT transform.parent as RectTransform; 继承IPointerDownHandler 和IDragHandler …...

基于遗传算法的无人机三维路径规划仿真步骤详解
基于遗传算法的无人机三维路径规划仿真步骤详解 一、问题定义 目标:在三维空间内,寻找从起点到终点的最优路径,需满足: 避障:避开所有障碍物。路径最短:总飞行距离尽可能短。平滑性:转折角度不宜过大,降低机动能耗。输入: 三维地图(含障碍物,如立方体、圆柱体)。起…...

windows下使用Hyper+wsl实现ubuntu下git的平替
文章目录 前言一、安装Hyper、wsl1. 安装Hyper2. 安装wsl 二、配置Hyper三、安装并使用git总结 前言 众所周知,Ubuntu下安装git只需执行sudo apt install git即可使用默认终端拉取代码,但是Windows上使用git既没有linux便捷,又没有MacOS优雅…...

基于Java+SpringCloud+Vue的前后端分离的房产销售平台
基于JavaSpringCloudVue的前后端分离的房产销售平台 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#x…...

以影像技术重构智能座舱体验,开启驾乘互动新纪元
在汽车智能化浪潮席卷全球的今天,座舱体验早已突破传统驾驶功能的边界,成为车企竞争的核心赛道。美摄科技凭借其在图像处理与AI算法领域的深厚积累,推出全链路智能汽车图像及视频处理方案,以创新技术重新定义车载影像系统…...

deepseek在pycharm 中的配置和简单应用
对于最常用的调试python脚本开发环境pycharm,如何接入deepseek是我们窥探ai代码编写的第一步,熟悉起来总没坏处。 1、官网安装pycharm社区版(免费),如果需要安装专业版,需要另外找破解码。 2、安装Ollama…...

LLM大型语言模型(一)
1. 什么是 LLM? LLM(大型语言模型)是一种神经网络,专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络,通常训练于海量文本数据上,有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …...

尚庭公寓项目记录
数据库准备 保留图像时,保存图像地址就可以数据表不是越多越好,可以用中间表来实现俩个表之间的联立这样方便查数据但是却带来性能问题而减少表的jion但是提高性能,以冗余来换去性能采用MySQL,InnoDB存储引擎物理删除和逻辑删除逻…...

飞算JavaAI编程工具集成到idea中
AI插件介绍 飞算AI的插件下载地址,里边也有安装步骤: JavaAI 以上图是不是看着很牛的样子,一下成为高手确实说的太夸张了点, 一键生成后端JavaWeb项目还是挺方便的。 飞算JavaAI插件安装 Idea->>file->>setting-&…...

【每日八股】计算机网络篇(二):TCP 和 UDP
目录 TCP 的头部结构?TCP 如何保证可靠传输?1. 确认应答机制2. 超时重传3. 数据排序与去重4. 流量控制5. 拥塞控制6. 校验和 TCP 的三次握手?第一次握手第二次握手第三次握手 TCP 为什么要三次握手?问题一:防止历史连接…...

课程《MIT Introduction to Deep Learning》
在Youtubu上,MIT Introduction to Deep Learning (2024) | 6.S191 共8节课: (1) MIT Introduction to Deep Learning (2024) | 6.S191 (2) MIT 6.S191: Recurrent Neural Networks, Transformers, and Attention (3) MIT 6.S191: Convolutional Neural N…...

GCC RISCV 后端 -- C语言语法分析过程
在 GCC 编译一个 C 源代码时,先会通过宏处理,形成 一个叫转译单元(translation_unit),接着进行语法分析,C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…...

UI组件库及antd
什么是UI组件库及antd安装 随着商业化的趋势,企业级产品中需求多且功能复杂,且变动和并发频繁,常常需要设计者与开发者快速做出响应,同时这类产品中有很多类似的页面及组件,可以通过抽象得到一些稳定且高复用性的内容…...

Windows下使用ShiftMediaProject方法编译FFmpeg
Windows SDK 8.1版本不支持dxva vp9! 需要10.0.17134.0!或者把config编译选项去掉 1.下载源码 https://github.com/ShiftMediaProject 2.创建ShiftMediaProject文件夹 把下载好的源码放入source 3.进入SMP执行 project_get_dependencies.bat 自动下载ffmepg依赖项…...

【计算机网络入门】TCP拥塞控制
目录 1. TCP拥塞控制和TCP流量控制的区别 2. 检测到拥塞该怎么办 2.1 如何判断网络拥塞? 3. 慢开始算法 拥塞避免算法 4.快重传事件->快恢复算法 5. 总结 1. TCP拥塞控制和TCP流量控制的区别 TCP流量控制是控制端对端的数据发送量。是局部的概念。 TCP拥…...

无人机遥控器无线传输技术解析!
一、主流无线传输方式 无线电遥控系统(2.4GHz/5.8GHz频段) 频段特性:2.4GHz频段穿透力强、覆盖距离远(可达2公里以上),适合控制信号传输;5.8GHz频段带宽更高,适用于高清视频流&…...

修改hosts文件,修改安全属性,建立自己的DNS
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

MySQL零基础教程16—表连接进阶
复习表别名 之前已经学习过,查询的时候可以使用as来对检索的列进行重命名,这样可以让sql更加简介,增强易读性(as可以省略) 此外,使用表别名还可以支持在一条select语句中,一个表是被多次使用 …...

【软件系统架构】系列三:数据库系统之三
1.数据故障与备份 1.1 安全措施 措施说明用户标识和鉴定最外层的安全保护措施,可以使用用户帐户、口令及随机数检验等方式存取控制对用户进行授权,包括操作类型(如查找、插入、删除、修改等动作)和数据对象(主要是数…...

lamp平台介绍
一、lamp介绍 网站: 静态 动态 php语言 .php 作用:运行php语言编写动态网站应用 lamp Linux Apache MySQL PHP PHP是作为httpd的一个功能模块存在的 二、部署lamp平台 1、测试httpd是否可正常返回PHP的响应 2、测试PHP代码是否可正常连接数据…...

826考研
初试总分第一的hh佬小红书:https://www.xiaohongshu.com/user/profile/64e106aa000000000100fe33 深研院巨佬经验贴:https://zhuanlan.zhihu.com/p/690464528 本部羊神经验贴:https://zhuanlan.zhihu.com/p/689494655 本部学硕佬经验贴&#…...

局域网自动识别机器名和MAC并生成文件的命令
更新版本:添加了MAC 地址 确定了设备唯一性 V1.1 局域网自动识别机器名和MAC并生成文件的批处理命令 echo off setlocal enabledelayedexpansionREM 设置输出文件 set outputFilenetwork_info.txtREM 清空或创建输出文件 echo Scanning network from 192.168.20.1…...

todo: 使用融云imserve做登录(android)
使用融云做登录注册思路 注册界面需要name, email, password考虑到融云注册用户的post格式 POST http://api.rong-api.com/user/getToken.json?userId1690544550qqcom&nameIronman这里的userId可以使用用户的email,但是要截断和 . 符号,即1690544…...