【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安装 随着商业化的趋势,企业级产品中需求多且功能复杂,且变动和并发频繁,常常需要设计者与开发者快速做出响应,同时这类产品中有很多类似的页面及组件,可以通过抽象得到一些稳定且高复用性的内容…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
