【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:返回底层数组…...
【详细讲解在STM32的UART通信中使用DMA机制】
详细讲解在STM32的UART通信中使用DMA机制 目录 详细讲解在STM32的UART通信中使用DMA机制一、DMA机制概述二、DMA在UART中的作用三、DMA的配置步骤四、UART初始化与DMA结合五、DMA传输的中断处理六、DMA与中断的结合使用七、注意事项与常见问题八、代码示例九、总结 一、DMA机制…...
极狐GitLab 17.9 正式发布,40+ DevSecOps 重点功能解读【三】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...
快速生成viso流程图图片形式
我们在写详细设计文档的过程中总会不可避免的涉及到时序图或者流程图的绘制,viso这个软件大部分技术人员都会使用,但是想要画的好看,画的科学还是比较难的,现在我总结一套比较好的方法可以生成好看科学的viso图(图片格式)。主要思…...
设备管理系统功能与.NET+VUE(IVIEW)技术实现
在现代工业和商业环境中,设备管理系统(Equipment Management System,简称EMS)是确保设备高效运行和维护的关键工具。本文采用多租户设计的设备管理系统,基于.NET后端和VUE前端(使用IVIEW UI框架)…...
《深度学习实战》第11集:AI大模型压缩与加速
深度学习实战 | 第11集:AI大模型压缩与加速 在深度学习领域,随着模型规模的不断增大,模型的推理速度和部署效率成为实际应用中的关键挑战。本篇博客将带你深入了解模型压缩与加速的核心技术,并通过一个实战项目展示如何使用知识蒸…...
【大模型安全】大模型的技术风险
【大模型安全】大模型的技术风险 1.DDoS攻击2.常见的传统网络攻击方式3.恶意意图的识别4.AI生成虚假信息传播5.利用AI进行黑客攻击6.模型对抗攻击7.后门攻击8.Prompt攻击9.数据投毒攻击10.模型窃取攻击11.数据窃取攻击 1.DDoS攻击 2023年11月9日凌晨,OpenAI在官网公…...
git命令学习记录
1. git reset 参数说明 git reset 是用来回退版本的,它可以添加三个参数,常用的使用格式是这样的:git reset [--hard | --soft | --mixed] 版本号 一般使用git修改文件并提交需要三步,第一步在文本编辑器中编辑文件,也…...
Gartner:数据安全平台DSP提升数据流转及使用安全
2025 年 1 月 7 日,Gartner 发布“China Context:Market Guide for Data Security Platforms”(《数据安全平台市场指南——中国篇》,以下简称指南),报告主要聚焦中国数据安全平台(Data Securit…...
结构型模式---享元模式
概念 享元模式是一种结构型设计模式,他摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态:就…...
一学就会:A*算法详细介绍(Python)
📢本篇文章是博主人工智能学习以及算法研究时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在&am…...
【Elasticsearch】Elasticsearch 中使用 HDFS 存储快照
在 Elasticsearch 中使用 HDFS 存储快照的步骤如下: 1.安装 HDFS 插件 要使用 HDFS 存储 Elasticsearch 的索引快照,需要在 Elasticsearch 集群的所有节点上安装 HDFS 插件。 • 在线安装:适用于网络环境良好的场景,执行以下命…...
【每日十题系列】前端面试高频题目
以下是作为前端面试官常用的10道手撕代码题目,涵盖JavaScript核心、CSS、算法及框架原理,结合高频考点与实际开发场景设计: 1. 手写防抖(debounce)与节流(throttle) 要求:实现防抖函…...
Kafka 消息 0 丢失的最佳实践
文章目录 Kafka 消息 0 丢失的最佳实践生产者端的最佳实践使用带有回调的 producer.send(msg, callback) 方法设置 acks all设置 retries 为一个较大的值启用幂等性与事务(Kafka 0.11)正确关闭生产者与 flush() 方法 Broker 端的最佳实践设置 unclean.l…...
学网络安全报班可靠吗?
在当今社会,网络安全已经成为我们工作和生活中不可忽视的重要部分,而且市场上各大企业对网络安全人才的需求量非常之大,因此网络安全培训班应运而生,那么学网络安全报培训班靠谱吗?这是很多小伙伴都关心的问题,我们来…...
LeetCode 1745.分割回文串 IV:动态规划(用III或II能直接秒)
【LetMeFly】1745.分割回文串 IV:动态规划(用III或II能直接秒) 力扣题目链接:https://leetcode.cn/problems/palindrome-partitioning-iv/ 给你一个字符串 s ,如果可以将它分割成三个 非空 回文子字符串,…...
4 Redis4 List命令类型讲解
Redis 列表(List)命令详解 1. Redis 列表(List)简介 Redis 列表(List)是一个简单的字符串列表,按照插入顺序排序。它可以用作 栈(Stack) 和 队列(Queue&…...
鬼泣:项目前置设置杂项
能帮到你的话,就给个赞吧 😘 文章目录 插件niagara ui render:在 UI 中渲染 Niagara 特效skeletal editor:编辑骨骼,调整骨骼动画motion warping:根据目标自动调整角色动画。animation warping:…...
MyBatis-Plus 条件构造器的使用(左匹配查询)
在上一篇文章中,我们已经介绍了 MyBatis-Plus 条件构造器,包括 QueryWrapper 和 UpdateWrapper 的基本使用方法、常见查询条件(如等于、不等于、大于、小于)以及如何使用 Lambda 表达式来构建动态查询和更新条件。 在本文中&…...
#define GBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg))
这个宏 #define GBB_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) 是用来在 C++ 中标记某些函数、变量或者代码元素为已弃用(deprecated)的,并附带一个自定义的弃用消息。 具体解释: __declspec(deprecated(msg)): __declspec 是 Microsoft Visual C++ (MSVC) 的扩展…...
Vue输入框获取焦点
1. 元素未渲染完成 如果你在组件挂载或数据更新后立即调用 focus(),可能元素还未渲染到 DOM 中,导致 focus() 失效。 解决方法:确保在元素渲染完成后再调用 focus()。可以使用 nextTick 确保 DOM 更新完成。 2. ref 未正确绑定 确保 ref 正确…...
辛格迪客户案例 | 深圳善康医药科技GMP培训管理(TMS)项目
01 善康医药:创新药领域的探索者 深圳善康医药科技股份有限公司自2017年创立以来,便扎根于创新药研发领域,专注于成瘾治疗药物的研究、生产与销售。公司坐落于深圳,凭借自身独特的技术优势与研发实力,在行业内逐渐崭露…...
迷你世界脚本出生点接口:Spawnport
出生点接口:Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...
Android车机DIY开发之软件篇(二十)立创泰山派android编译
准备工作 sudo apt-get update sudo apt-get install git -y sudo apt install repo -ysudo apt-get install python2.7sudo apt-get install python3sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /u…...
MDM 如何彻底改变医疗设备的远程管理
在现代医疗行业迅速发展的格局中,医院和诊所越来越依赖诸如医疗平板和移动工作站等移动设备。这些设备在提高工作效率和提供卓越的患者护理方面发挥着关键作用。然而,随着它们的广泛使用,也带来了一系列挑战,例如在不同地点确保数…...
Libgdx游戏开发系列教程(6)——游戏暂停
目录 最初方案1 优化方案2 - 事件拦截器监听按键 优化方案3 - 暂停状态重绘 优化方案4 优化方案5 补充 - 监听android手机的返回键 暂停也是一个游戏的必要功能了,本文研究了Libgdx实现游戏暂停 例子以桌面端游戏实现讲解为主,至于移动端,可能之后会进行补充... 本文最…...
车载测试:智能座舱测试中多屏联动与语音交互的挑战
智能座舱作为汽车智能化发展的核心,集成了多屏联动和语音交互功能,为驾驶员和乘客提供更便捷的体验。然而,这些功能的测试面临诸多挑战,包括多屏同步性、噪声干扰和复杂场景的处理。本文将详细分析这些挑战,探讨测试方…...
【踩坑随笔】`npm list axios echarts`查看npm依赖包报错
npm list axios echarts查看npm依赖包出现以下报错,原因就是包的版本匹配问题,按照提示降axios版本或者自己升找合适的got版本,我这里是选择了降版本。本文记录仅做解决思路参考不一定适配大家的实际情况。 weed-detection-system1.0.0 E:\P…...
用于管理 Elasticsearch Serverless 项目的 AI Agent
作者:来自 Elastic Fram Souza 由自然语言驱动的 AI 代理,可轻松管理 Elasticsearch Serverless 项目 - 支持项目创建、删除和状态检查。 这个小型命令行工具让你可以用简单的英语管理你的无服务器 Elasticsearch 项目。它通过AI(这里是 Ope…...
【文生图】windows 部署stable-diffusion-webui
windows 部署stable-diffusion-webui AUTOMATIC1111 stable-diffusion-webui Detailed feature showcase with images: 带图片的详细功能展示: Original txt2img and img2img modes 原始的 txt2img 和 img2img 模式 One click install and run script (but you still must i…...
STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力(代码实现)
STaR(Self-Taught Reasoner)方法:让语言模型自学推理能力 在大型语言模型(LLM)的推理能力优化中,STaR(Self-Taught Reasoner) 是一种引人注目的技术,属于“修改提议分布…...
十大经典排序算法简介
一 概述 本文对十大经典排序算法做简要的总结(按常用分类方式排列),包含核心思想、时间/空间复杂度及特点。 二、比较类排序 1. 冒泡排序 (BUBBLE SORT) 思想:重复交换相邻逆序元素,像气泡上浮 复杂度: 时间:O(n^2)(最好情况O(n)) 空间:O(1) 特点:简单但效率低,稳…...
5.训练策略:优化深度学习训练过程的实践指南——大模型开发深度学习理论基础
在实际开发中,训练策略对神经网络的表现起着至关重要的作用。通过合理的训练策略,我们可以有效避免过拟合和欠拟合,加速模型收敛,并提升最终性能。本文将从实际开发角度详细介绍几种关键的训练策略,包括 Early Stoppin…...
道可云人工智能每日资讯|《奇遇三星堆》VR沉浸探索展(淮安站)开展
道可云元宇宙每日简报(2025年3月5日)讯,今日元宇宙新鲜事有: 《奇遇三星堆》VR沉浸探索展(淮安站)开展 近日,《奇遇三星堆》VR沉浸探索展(淮安站)开展。该展将三星堆文…...
Camera相关配置
一、 Purpose目的 通常, 感知模块使用雷达点云和相机图像来对物体进行检测和分类,感知数据分别来自雷达和相机,就传感器数据融合准确性,我们需要雷达和相机同一时间捕捉到同一物体(时间间隔尽可能短),否则一个真实的物…...
PHP Error处理指南
PHP Error处理指南 引言 在PHP开发过程中,错误处理是一个至关重要的环节。正确的错误处理不仅能够提高代码的健壮性,还能提升用户体验。本文将详细介绍PHP中常见的错误类型、错误处理机制以及最佳实践,帮助开发者更好地应对和处理PHP错误。 PHP错误类型 在PHP中,错误主…...
【Pandas】pandas Series argmax
Pandas2.2 Series Computations descriptive stats 方法描述Series.argsort([axis, kind, order, stable])用于返回 Series 中元素排序后的索引位置的方法Series.argmin([axis, skipna])用于返回 Series 中最小值索引位置的方法Series.argmax([axis, skipna])用于返回 Series…...
Gitlab配置personal access token
1.点击左上角个人账号 -> Preferences 2. 点击左边栏 Access Tokens 3. 点击Add new token ,输入token名称,勾选权限(注意截至日期 “Expiration date” 可不填) 4. 创建成功后,显示token信息,复制到本地…...
【MySQL、Oracle、SQLserver、postgresql】查询多条数据合并成一行
四大数据库多行合并为单行:函数详解与对比 一、MySQL**GROUP_CONCAT()** 函数说明:语法结构:参数解释:示例:注意事项: 二、Oracle**LISTAGG()** 函数说明:语法结构:参数解释…...
人机交互进化论:解码智能手机81种交互方式背后的用户体验革命
人机交互进化论:解码智能手机81种交互方式背后的用户体验革命 2023年艾瑞咨询报告显示:中国智能手机用户日均触屏交互超2500次,解锁屏幕达76次/天。在这看似简单的点击与滑动背后,隐藏着一场持续演进的人机交互革命。本文将深度解…...
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台
OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 引言 OCPP作为开放协议,其核心价值在于平衡标准化与可扩展性。面对不同充电桩厂商的硬件差异、区域能源政策及定制化业务需求,OCPP通过**扩展点(Extension Points)…...
网络编程之TCP协议
传输层协议:UDP和TCP的区别 UDP:用户数据报协议 1.面向数据报 2.无连接 3.不安全,不可靠(尽最大努力交付) TCP:传输控制协议 1.面向数据流(流式套接字) 2.建立连接 3.安全可靠的传输协议 TCP的传输过程 三次握手:TCP建立…...
策略模式的C++实现示例
核心思想 策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用它的客户端,从而使得客户端可以根据需要动态切换算法,而不需要修改…...
keil软件下载安装使用(STM32篇)
一、前言 Keil软件是一款专为嵌入式系统开发设计的集成开发环境(IDE),由德国Keil公司创立,后被ARM公司收购并持续更新维护。它集成了代码编辑、编译、调试和项目管理等功能,广泛应用于各类单片机的程序开发࿰…...
【简单的C++围棋游戏开发示例】
C围棋游戏开发简单示例(控制台版) 核心代码实现 #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 简化棋盘为9x9:ml-citation{ref"1" data"citationList&…...
【Python 数据结构 4.单向链表】
目录 一、单向链表的基本概念 1.单向链表的概念 2.单向链表的元素插入 元素插入的步骤 3.单向链表的元素删除 元素删除的步骤 4.单向链表的元素查找 元素查找的步骤 5.单向链表的元素索引 元素索引的步骤 6.单向链表的元素修改 元素修改的步骤 二、Python中的单向链表 编辑 三…...
组合逻辑和时序逻辑
组合逻辑 定义 组合逻辑电路是一种输出只取决于当前输入值的电路,即电路的输出状态仅由当前时刻的输入信号组合决定,与电路过去的状态无关。 特点 无记忆功能:组合逻辑电路不具备存储信息的能力,它不会记住之前的输入情况。每次…...
如何有效判断与排查Java GC问题
目录 一、GC的重要性与对性能的影响 (一)GC对性能的影响简要分析 1.GC暂停与应用停顿 2.GC吞吐量与资源利用率 3.GC对内存管理的作用:资源回收 4.GC策略与优化的选择 (二)GC的双刃剑 二、GC性能评价标准 &…...
Ubuntu20.04 在离线机器上安装 NVIDIA Container Toolkit
步骤 1.下载4个安装包 Index of /nvidia-docker/libnvidia-container/stable/ nvidia-container-toolkit-base_1.13.5-1_amd64.deb libnvidia-container1_1.13.5-1_amd64.deb libnvidia-container-tools_1.13.5-1_amd64.deb nvidia-container-toolkit_1.13.5-1_amd64.deb 步…...
【流行病学】Melodi-Presto因果关联工具
title: “[流行病学] Melodi Presto因果关联工具” date: 2022-12-08 lastmod: 2022-12-08 draft: false tags: [“流行病学”,“因果关联工具”] toc: true autoCollapseToc: true 阅读介绍 Melodi-Presto: A fast and agile tool to explore semantic triples derived from …...