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

C++ --- vector

C++ --- vector的使用

  • 前言
  • 1、构造函数
    • 1.1默认构造
    • 1.2n个val值构造
    • 1.3迭代器区间构造
    • 1.4拷贝构造
    • 1.4初始化列表构造
  • 2、遍历方式
    • 2.1[ ] + 下标
    • 2.2迭代器
    • 2.3范围for
  • 3、常用方法或重载
    • (1)增
      • push_back()
      • insert()
      • assign()
    • (2)删
      • erase()
      • clear()
      • pop_back()
    • (3)查
      • operator[ ]
      • at()
      • front() 与 back()
      • data()
    • (4)大小与容量
      • size()
      • resize()
      • empty()
      • capacity()
      • reserve()
      • shrink_to_fit
    • (5)其他
      • operator =
      • ~vector< type > - - - (析构)
      • 全局函数swap与成员函数swap
      • 关系运算符重载
      • emplace()与emplace_back()

前言

这次学习vector的使用,vector(矢量)就是数据结构中的顺序表。
其大体用法和string类似,没有string类的冗杂,可以说vector是string的精简。

vector是一个类模板,使用它时要指定其实际类型,例如:vector< int > v1;

1、构造函数

在这里插入图片描述
上述构造现在除开第五个右值引用不讲,下文讲述其他的构造。
参数列表的 const allocator_type& alloc = allocator_type() 是空间配置器(STL的六大组成之一),也就是内存池,只在极少数的情况下我们会自己去传递此参数,绝大多数情况就是使用底层实现好的内存池即可,所以不用管他,给定缺省值即可。

1.1默认构造

	// 构造一个空对象vector<int> v1;

1.2n个val值构造

	// 开5个空间大小的vector,没有第二个参数则使用0进行初始化vector<int> v2(5);// 开10个空间大小的vector,使用2进行初始化vector<int> v3(10, 2);

1.3迭代器区间构造

	// 使用v3对象的迭代器区间进行构造vector<int> v4(v3.begin(), v3.end());

1.4拷贝构造

	// 拷贝构造vector<int> v5(v4);

1.4初始化列表构造

	// 初始化列表构造 --- 支持下面三种写法vector<int> v6({ 10,20,30,40 });vector<int> v6 = { 10,20,30,40 };      // 最常见的写法vector<int> v6{ 10,20,30,40 };

这是C++11新引入的新特性。

在这里介绍一下它:
initializer list 是一个类模板,使得STL容器能够使用一对 { } 来初始化对象。

通过typeid可以观察这一表示方法的实际类型:
在这里插入图片描述
所以引申至vector,也可以使用一对 { } 来构造对象,而上述最常见的写法是一个单参数的隐式类型转化,先构造一个initializer list,再拷贝构造临时对象,最后编译器会对此过程优化,成为直接构造。

2、遍历方式

2.1[ ] + 下标

因为vector底层也是一个数组,所以它也可以和string一样使用"[ ] + 下标"的形式遍历对象。

	//(1)[ ] + 下标cout << "[]+下标:";for (size_t i = 0; i < v.size(); i++){cout << v[i] ;}cout << endl;

2.2迭代器

迭代器和string一模一样,begin指向首元素的位置,end指向最后一个元素的下一个位置,也就是一个左闭右开区间:[begin,end),它俩相减就是此区间内的元素个数。

	//(2)迭代器cout << "正向迭代器:";vector<int>::iterator it1 = v.begin();vector<int>::iterator it2 = v.end();while (it1 != it2){cout << *it1;++it1;}cout << endl;cout << "反向迭代器:";vector<int>::reverse_iterator it3 = v.rbegin();vector<int>::reverse_iterator it4 = v.rend();while (it3 != it4){cout << *it3;++it3;}cout << endl;// const正向迭代器// const反向迭代器

此外还有const正向迭代器和const反向迭代器,使用于const修饰的对象。

2.3范围for

范围for底层就是迭代器,支持迭代器也就支持范围for。

	//(3)范围for// 对于内置类型,不用加引用cout << "范围for:";for (auto e : v){cout << e;}cout << endl;// 对于自定义类型,比如string类型,要使用引用vector<string> vs;// push操作...for(auto& e : vs){cout << e;}

为什么对于内置类型不用加引用,而自定义类型要加引用呢?
因为首先范围for的底层是迭代器,是讲对象的迭代器类似于拷贝给给e,提到拷贝,对于内置类型进行浅拷贝(拷贝成本低,是否使用引用影响不大),而对于自定义类型是进行的深拷贝,为了减少不必要的深拷贝操作,所以需要加上引用,若不是使用引用,则会调用拷贝构造,增加不必要的操作。

3、常用方法或重载

(1)增

push_back()

功能:在顺序表尾部插入一个元素。
例:

	vector<int> v;// push_back()// 功能:在顺序表的末尾添加一个元素v.push_back(1); v.push_back(10);v.push_back(100);v.push_back(1000);v.push_back(10000);// 打印对象:for (auto e : v){cout << e << " ";}cout << endl;

打印结果:
在这里插入图片描述

insert()

功能:在任意pos位置(迭代器)之前插入一个元素。
例:

	// insert()// 功能:在pos位置之前插入元素// 在pos位置之前插入一个元素(1):		iterator insert(iterator position, const value_type & val);// 在pos位置之前插入 n个元素(2):     void insert(iterator position, size_type n, const value_type & val);// 在pos位置之前插入一段迭代器区间(3)://		template <class InputIterator>//			void insert(iterator position, InputIterator first, InputIterator last);vector<int> v1;size_t j = 0;for (int i = 20; i <= 40; i+=2){v1.push_back(i);cout << v1[j++] << " ";}// (1)在40位置之前插入39v1.insert(v1.end() - 1, 39);// (2)在22位置之前插入3个0v1.insert(v1.begin() + 1, 3, 0);// (3)在30位置之前插入v的迭代器区间v1.insert(v1.begin() + 8, v.begin(), v.end());for (auto e : v1){cout << e << " ";}cout << endl;cout << "--------------------------------------------------------" << endl;

运行结果:

在这里插入图片描述

这里的迭代器加减常数是确定插入的位置,begin()是首元素的迭代器,自然就是下标为0的位置,加几就是在那个位置之前插入插入数据,例如(3),由于(2)的原因,在30的数据之前又新插入了3个数据,所以下标从原来的5 -> 8,所以要在30之前插入数据,begin() + 8即可,
end()也是如此。

assign()

功能:填充顺序表或者替换现有顺序表内容。
例:

	// asign()// 功能:填充顺序表或者替换现有内容// 插入一段迭代器区间(1)://		template <class InputIterator>//			void assign(InputIterator first, InputIterator last);// 增加n个val(2):		void assign(size_type n, const value_type & val);vector<int> v4;// 向空的对象增加数据v4.assign(5, 3);                 // n个val v4.assign(v.begin(), v.end());   // 迭代器区间cout << endl;cout << "--------------------------------------------------------" << endl;

运行结果:

在这里插入图片描述

对于assign()接口,对一个空的对象使用则是添加数据,上述两种方式都可以,但是若此对象不是空对象,则会变成替换功能,也就是先清空数据,再添加数据。例如上述代码中的assign(),第一次是对v4对象初始化,后面的一次assign()是对v4对象的内容进行替换。

(2)删

erase()

功能:删除pos位置(迭代器)的元素。
例:

	// evase()// 功能:删除pos位置(迭代器)的元素。// 删除pos位置的数据:iterator erase(iterator position);// 删除一段迭代器区间:iterator erase(iterator first, iterator last);vector<int> v2;for (int i = 0; i < 10; i++){v2.push_back(i);}// 删除pos位置的数据 --- 参数使用迭代器vector<int>::iterator it1 = v2.begin();v2.erase(it1 + 5);   // 删除5for (auto e : v2){cout << e << " ";}// 删除一段迭代器区间 --- 参数使用迭代器vector<int>::iterator it1 = v2.begin();vector<int>::iterator it2 = v2.end();v2.erase(it1 + 6 ,it2);   // 删除6~9for (auto e : v2){cout << e << " ";}// 最常用方法: 结合find删除指定元素// vector<int>::iterator pos = find(v2.begin(), v2.end(), 5);auto pos = find(v2.begin(), v2.end(), 5);v2.erase(pos);for (auto e : v2){cout << e << " "; }

运行结果:

删除5:
在这里插入图片描述

删除6~9:
在这里插入图片描述

结合find()删除元素5:
在这里插入图片描述

vector和string有些不同,find()接口是调用的算法库里面的find方法,vector自身模板类是没有实现find接口的,下面介绍一下算法库的find():
std::find
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);

参数列表是迭代器区间和一个目标值,返回值是一个此目标值的迭代器。

clear()

功能:清除对象的整个资源,不删除空间。
例:

	// 功能:清空资源,不是删除空间v2.clear();

pop_back()

功能:删除顺序表的最后一个元素。
例:

	// pop_back()// 功能:删除顺序表的最后一个元素vector<int> v3;v3.push_back(1);v3.push_back(2);v3.push_back(3);v3.push_back(4);v3.push_back(5);cout << "删除前:";for (auto e : v3){cout << e;}cout << endl;v3.pop_back();cout << "删除后:";for (auto e : v3){cout << e;}

运行结果:
在这里插入图片描述

(3)查

operator[ ]

功能:返回指定下标位置的元素。
例:

	// operator[ ]// 功能:返回指定下标位置的数据vector<int> v4;v4.push_back(1);v4.push_back(2);v4.push_back(3);v4.push_back(4);v4.push_back(5);// 对下标为0的元素加1cout << ++v4[0] << endl;          // 1 -> 2

此重载对于非法位置进行访问时会进行assert断言检查错误。

越界操作:
在这里插入图片描述

程序会直接崩溃。

at()

功能:返回指定下标位置的元素。
例:

	vector<int> v4;v4.push_back(1);v4.push_back(2);v4.push_back(3);v4.push_back(4);v4.push_back(5);// 对下标为4的元素加1cout << ++v4.at(4) << endl;          // 5 -> 6

注意,此方法对于越界操作的检查是使用抛异常,和[ ] 不一样。

越界操作:
在这里插入图片描述

会抛出 invalid vector subscript 也就是无效向量下标的异常。

front() 与 back()

功能:返回对象首元素和返回对象尾元素。
例:

	// front()// 功能:返回对象的首元素cout << v4.front() << endl;            // 1// back()// 功能:返回对象的尾元素。cout << v4.back() << endl;             // 5

data()

功能:返回对象底层指向数组的指针。
例:

	// data()// 功能:返回底层指向数组的指针。cout << v4.data();

(4)大小与容量

size()

功能:查看顺序表对象的大小
例:

	//(1)size()// 功能:查看顺序表对象的大小vector<int> v;v.push_back(1);v.push_back(1);v.push_back(1);v.push_back(1);v.push_back(1);cout << v.size();          // size = 5

resize()

功能:调整对象的大小。
例:

	//(6)resize()// 功能:调整对象的大小vector<int> v5 = { 1,2,3,4,5,6,7 };// n < size --- 缩小至给定大小,并且多余数据也会同步删除v5.resize(3);// n > size --- 扩大至给定大小,若没有第二个参数,则默认为0,有则使用指定的值v5.resize(10);        // 未指定v5.resize(10, 8);     // 指定

调试观察:

n < size:
在这里插入图片描述

n > size,指定val:
在这里插入图片描述

n > size,未指定val:
在这里插入图片描述

注意,当 n < capacity时,容量大小不会变化,而当 n > capacity时,capacity也会相应的增加到指定的n值。

empty()

功能:检查对象的大小是否为空。
例:

	//(5)empty()//功能:检查对象的大小是否为空,为空则返回真(true),反之返回假(false)vector<int> v4;// 对空对象bool b1 = v4.empty();cout << b1 << endl;        // 1 --- true// 对非空对象v4.push_back(1);bool b2 = v4.empty();cout << b2 << endl;        // 0 --- false

capacity()

功能:查看顺序表对象此时的容量大小。
例:

	//(2)capacity()// 功能:查看顺序表对象此时的容量大小vector<int> v2;// 记录起始的容量大小size_t temp = v2.capacity();for (size_t i = 0; i < 100; i++){// 向空对象push数据v2.push_back(i);// != 则说明扩容了 --- 输出它观察if (temp != v2.capacity()){cout << v2.capacity() << endl;// 再将扩容后大小赋值给给temp,重复操作temp = v2.capacity();}}

运行结果:
在这里插入图片描述
综上运行结果,可以观察出vector的底层扩容机制是1.5倍扩容,这和string的底层扩容是一样的。

reserve()

功能:只会扩容,会将容量扩至给定的大小,不会缩容。
例:

	//(3)reserve()// 功能:进行扩容,会将容量扩至给定的大小。vector<int> v3 = { 1,2,3,4,5 };cout << "扩容前:" << v3.capacity() << endl;v3.reserve(100);cout << "扩容后:" << v3.capacity() << endl;

运行结果:
在这里插入图片描述
注意,此接口和string的reserve就不一样了,若给定的容量值小于capacity时,vector是不会进行缩容的,它只有扩容的功能,尽管string面对给定的容量值小于capacity时,是一个不受约束力的请求,没有vector这样限制死。

shrink_to_fit

功能:进行缩容,缩至适应的大小。
例:

	//(4)shrink_to_fit()// 功能:缩容。v3.shrink_to_fit();     // 对于上述reserve后的v3进行缩容

运行结果:
在这里插入图片描述
但是缩容的代价是很大的,并不是直接对原空间进行缩小容量,而是在同一空间区域内找到符合缩容后的空间,将原空间内的数据拷贝进新空间,再将原空间释放,不怎么推荐使用此接口。

(5)其他

operator =

功能:拷贝。
例:

	// operator =// 功能:拷贝// 拷贝同类型对象(1):		vector& operator= (const vector & x);// 初始化列表(3):			vector& operator= (initializer_list<value_type> il);vector<int> v;vector<int> v1;v = v1;v = { 1,2,3,4,5 };

常用的就是使用初始化列表进行构造。

~vector< type > - - - (析构)

功能:清理对象的资源,不是销毁空间。

全局函数swap与成员函数swap

功能:交换两个对象,使用谁效果都差不多。

关系运算符重载

功能:对两个对象进行大小比较。

emplace()与emplace_back()

功能:emplace()和insert()相似,emplace_back()和push_back()相似。
在功能上两者没有什么较大的区别,但是在底层的实现上emplace与emplace_back要复杂的多。
所以在这里只演示怎么使用,不讲述底层机制。
例:

	// emplace() 与 emplace_back()// 功能:emplace()和insert()相似,//       emplace_back()和push_back()相似// 在功能上两者没有什么较大的区别,但是在底层的实现上emplace与emplace_back要复杂的多。// 所以在这里只演示怎么使用,不讲述底层机制。struct A
{// 构造函数A(int a1, int a2):_a1(a1),_a2(a2){cout << "A(int a1, int a2)" << endl;}// 拷贝构造A(const A& aa):_a1(aa._a1),_a2(aa._a2){cout << "A(const A& aa)" << endl;}int _a1;int _a2;
};vector<A> v3;A aa1(1, 3);cout << "-----------" << endl;// 使用有名对象v3.push_back(aa1);v3.emplace_back(aa1);cout << "-----------" << endl;// 使用匿名对象v3.push_back(A(3, 3));v3.emplace_back(A(3, 3));cout << "-----------" << endl;// 使用多参数的隐式类型转化v3.push_back({ 3,3 });          // 多参数需要使用{ }//v3.emplace_back({ 3, 3 });      // 对于emplace_back这种写法是不行的cout << "-----------" << endl;// 但是可以这样:// 直接传构造成员的参数,这种效率较高v3.emplace_back(3, 3); 

运行结果:
在这里插入图片描述

除了最后一种用法,其余用法效率上和push_back()是差不多的。

并且对于上述多成员变量的类型,遍历的时候也是有一些不同的。
例:

	// C++11 --- 范围forfor (auto& e : v3){cout << e._a1 << "," << e._a2 << endl;}// C++17 --- 结构化绑定for (auto& [x,y] : v3){cout << x << "," << y << endl;}

由于上述第一种写法是将v3的迭代器指向的元素拷贝给给e,中间进行了一次拷贝构造,所以这里可以加上引用,代表e是v3迭代器指向的元素的别名,不用经历中间的拷贝操作。并且e是数组的元素,元素是A类型的数据,所以遍历需要访问其中的成员。

上述第二种写法是C++17里面的结构化绑定,其实机理和C++11的e是差不多的,能够将其对象的参数直接写在[ ]内,进行拷贝,从而遍历对象直接输出[ ]内部的参数(此参数名称可随便取)即可,由于中间也有拷贝操作,所以也需要加上引用,以减少拷贝操作。

相关文章:

C++ --- vector

C --- vector的使用 前言1、构造函数1.1默认构造1.2n个val值构造1.3迭代器区间构造1.4拷贝构造1.4初始化列表构造 2、遍历方式2.1[ ] 下标2.2迭代器2.3范围for 3、常用方法或重载&#xff08;1&#xff09;增push_back()insert()assign() &#xff08;2&#xff09;删erase()c…...

【python基础知识】变量名和方法名的单下划线(_)和双下划线(__)总结

文章目录 1. 单下划线前缀&#xff08;_variable 或 _method()&#xff09;2. 双下划线前缀&#xff08;__variable 或 __method()&#xff09;3. 前后双下划线&#xff08;__variable__ 或 __method__&#xff09;4. 单下划线&#xff08;_&#xff09;单独使用总结 在 Python…...

FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ FART 脱壳 fartthread 方法在 app 启动的时候&#xff08;ActivityThread&#xff09;开启 fart 线程&#xff0c;休眠 60 秒&#xff0c;等待 app 启动完成后…...

✅ 常用 Java HTTP 客户端汇总及使用示例

在 Java 开发中&#xff0c;HTTP 客户端是与服务端交互的关键组件。随着技术发展&#xff0c;出现了多种 HTTP 客户端库&#xff0c;本文汇总了常用的 Java HTTP 客户端&#xff0c;介绍其特点、适用场景&#xff0c;并附上简单使用示例&#xff0c;方便开发者快速选择和上手。…...

快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令

目录 1. uv 介绍2. uv 安装&#xff08;Windows版&#xff09;3. 快速模拟一个要发布到TestPyPI上的依赖包&#xff0c;scoful-test-lib3.1 初始化 uv init3.2 进入scoful-test-lib3.3 修改pyproject.toml3.4 使用命令 uv sync3.5. 使用命令 uv lock3.6 使用命令 uv build3.7 获…...

Keil调试模式下,排查程序崩溃简述

在Keil调试模式下&#xff0c;若程序崩溃&#xff0c;可以通过以下步骤来定位崩溃的位置&#xff1a; 一、查看调用栈&#xff08;Call Stack&#xff09; 打开调用栈窗口&#xff1a; 在Keil的调试模式下&#xff0c;点击菜单栏的“View” -> “Call Stack Window”&…...

Python读取PDF:文本、图片与文档属性

在日常的数据采集、文档归档与信息挖掘过程中&#xff0c;PDF格式因其版式固定、内容稳定而被广泛使用。Python 开发者若希望实现 PDF 内容的自动化提取&#xff0c;选择一个易用且功能完善的库至关重要。本文将介绍如何用Python实现 PDF文本读取、图片提取 以及 文档属性读取 …...

基于SpringBoot+Vue2的租房售房二手房小程序

角色&#xff1a; 管理员、房东、租客/买家 技术&#xff1a; springbootvue2mysqlmybatispagehelper 核心功能&#xff1a; 租房售房小程序是一个专注于房屋租赁和销售的综合性平台&#xff0c;基于SpringBootVue2MySQLMyBatisPageHelper技术栈开发&#xff0c;为用户提供…...

数学:学好数学需要对数系进行系统的对比和分析

数系范围:自然数通常是从 0 或 1 开始,用于计数的数,然后整数包括正负和零,有理数是分数,实数包括无理数,复数引入虚数单位。 运算性质:比如是否满足加法、乘法的封闭性,是否有逆元,是否有序,完备性等。 结构对比:比如代数结构,比如自然数是半群,整数是环,有理…...

基于本地LLM与MCP架构构建AI智能体全指南

一、AI智能体开发的新范式 随着人工智能技术的快速演进&#xff0c;AI智能体&#xff08;AI Agents&#xff09;正成为连接技术创新与实际应用的核心载体。从智能家居的温控系统到复杂的金融风控决策&#xff0c;AI智能体通过感知环境并执行目标导向的行为&#xff0c;正在重塑…...

AT2659_GNSS低噪声放大器芯片

AT2659 射频放大器在SiGe工艺平台上实现23dB增益与0.71dB噪声系数的优异组合&#xff0c;专为BDS/GPS/GLONASS/GALILEO多模导航系统优化设计。其宽电压适应能力&#xff08;1.4-3.6V&#xff09;与低至4.4mA的功耗特性&#xff0c;配合1.5mm1mm0.55mm的6脚DFN封装&#xff08;R…...

跨平台游戏引擎 Axmol-2.6.1 发布

Axmol 2.6.1 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 &#x1f64f;感谢所有贡献者及财务赞助者&#xff1a;scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 错误修复 修复Android armv7架构崩溃问题&…...

MADlib —— 基于 SQL 的数据挖掘解决方案(4)—— 数据类型之矩阵

目录 一、矩阵定义 二、MADlib 中的矩阵表示 1. 稠密 2. 稀疏 三、MADlib 中的矩阵运算函数 1. 矩阵操作函数分类 &#xff08;1&#xff09;表示函数 &#xff08;2&#xff09;计算函数 &#xff08;3&#xff09;提取函数 &#xff08;4&#xff09;归约函数&…...

ServBay 1.13.0 更新,新增第三方反向代理/内网穿透

ServBay 作为一款简化本地开发环境搭建与管理的强大工具&#xff0c;致力于打造一个开箱即用、稳定可靠的本地开发平台&#xff0c;让用户专注于代码编写&#xff0c;提升开发效率。 ServBay 1.13.0 正式发布&#xff01;本次更新聚焦于提升本地开发项目的外部可访问性、增强国…...

C#对象扩展方法:提升对象操作的灵活性与效率

C#对象扩展方法&#xff1a;提升对象操作的灵活性与效率 在C#编程中&#xff0c;我们经常需要对对象进行各种操作&#xff0c;如获取对象属性信息、转换对象格式、复制对象等。通过扩展方法&#xff0c;我们可以为现有类型添加新的功能&#xff0c;而无需修改原始类型的代码。…...

Python爬虫爬取天猫商品数据,详细教程【Python经典实战项目】

Python爬取天猫商品数据详细教程 一、前期准备 1. 环境配置 Python环境&#xff1a;确保已安装Python 3.x版本&#xff0c;建议使用Anaconda或直接从Python官网下载安装。第三方库&#xff1a; requests&#xff1a;用于发送HTTP请求。BeautifulSoup&#xff1a;用于解析HTM…...

Oracle 的 SEC_CASE_SENSITIVE_LOGON 参数

Oracle 的SEC_CASE_SENSITIVE_LOGON 参数 关键版本信息 SEC_CASE_SENSITIVE_LOGON 参数在以下版本中被弃用&#xff1a; Oracle 12c Release 1 (12.1)&#xff1a; 该参数首次被标记为"过时"(obsolete)但依然保持功能有效 Oracle 18c/19c 及更高版本&#xff1a; …...

Docker构建自定义的镜像

构建自定义的 Docker 镜像是 Docker 使用中的核心操作之一。通过自定义镜像&#xff0c;你可以将应用程序及其依赖环境打包成一个可移植的容器化镜像。以下是详细的步骤和注意事项&#xff1a; 1. 准备工作 在构建自定义镜像之前&#xff0c;你需要准备以下内容&#xff1a; D…...

【SSM】SpringMVC学习笔记8:拦截器

这篇学习笔记是Spring系列笔记的第8篇&#xff0c;该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记&#xff0c;供自己和他人参考。 Spring学习笔记目录 笔记1&#xff1a;【SSM】Spring基础&#xff1a; IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…...

井川里予瓜pdf完整版

井川里予瓜pdf完整版 下载链接&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/c75455d6be60 在网红文化盛行的当下&#xff0c;井川里予无疑是一位备受瞩目的人物。这位2001年出生于广东湛江的姑娘&#xff0c;凭借独特风格在网络世界掀起波澜&#xff0c;其发展轨迹…...

UI自动化常见的一些问题解决方式

1、遇到元素无法定位的情况 解决方法&#xff1a;&#xff08;1&#xff09;手写css 先找到父级的唯一元素 &#xff08;2&#xff09;手写xpath、 &#xff08;3&#xff09;js在浏览器控制台去定位 控制台定位样例&#xff1a;&#xff08;1&#xff09;…...

基于 Zynq 平台的 EtherCAT 主站的软硬件协同设计

摘要: 针对工业自动化对控制能力和强实时性的需求&#xff0c;提出了一种基于 FPGA 的改进型 EtherCAT 硬件主站方案 。 该方案利用 Zynq&#xff0d;7000 平台&#xff0c;在 PL 端实现 FPGA 协议栈&#xff0c;以保证核心功能的高效执 行 。 基于 AXI4 总线设计…...

聊一聊 .NET在Linux下的IO多路复用select和epoll

一&#xff1a;背景 1. 讲故事 在windows平台上&#xff0c;相信很多人都知道.NET异步机制是借助了Windows自带的 IO完成端口 实现的异步交互&#xff0c;那在 Linux 下.NET 又是怎么玩的呢&#xff1f;主要还是传统的 select&#xff0c;poll&#xff0c;epoll 的IO多路复用…...

从零开始的嵌入式学习day33

网络编程及相关概念 UDP网络通信程序 UDP网络通信操作 一、网络编程及相关概念 1. 网络编程概念&#xff1a; 指通过计算机网络实现程序间通信的技术&#xff0c;涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。…...

ArcGIS Pro 3.4 二次开发 - 宗地

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 宗地1 宗地1.1 向地图添加宗地图层1.2 获取活动记录1.3 设置活动记录1.4 创建新记录1.5 将标准线要素复制到宗地类型1.6 将宗地线复制到宗地类型1.7 将要素分配给活动记录1.8 创建宗地种子1.9 构建地块1.10 重复地块1.11 设置地块为…...

前端面试准备-7

1.定义class的实现 //定义class class Person{//公有属性nameage 18//构造函数constructor(name){//构造函数内部的this实例化对象this.name name//动态添加属性&#xff08;不推荐&#xff09;this.food [&#x1f402;,&#x1f40e;,&#x1f40f;]}//公有方法sayHi(){c…...

黑马Java面试笔记之框架篇(Spring、SpringMvc、Springboot)

一. 单例bean Spring框架中的单例bean是线程安全的吗&#xff1f; Spring框架中的bean是单例的&#xff0c;可以在注解Scope()进行设置 singleton&#xff1a;bean在每一个Spring IOC容器中只有一个实例。prototype&#xff1a;一个bean的定义可以有多个实例 总结 二. AOP AOP称…...

全球IP归属地查询接口如何用C#进行调用?

一、什么是全球IP归属地查询接口 在全球化互联网时代&#xff0c;IP地址作为网络世界的地理位置标识&#xff0c;扮演着至关重要的角色。全球IP归属地查询接口通过解析IP地址&#xff0c;提供包括国家、省、市、区县和运营商在内的详细信息。 二、应用场景 1. 访问识别 全球…...

NumPy 比较、掩码与布尔逻辑

文章目录 比较、掩码与布尔逻辑示例&#xff1a;统计下雨天数作为通用函数&#xff08;Ufuncs&#xff09;的比较运算符使用布尔数组计数条目布尔运算符 布尔数组作为掩码使用关键字 and/or 与运算符 &/| 的区别 比较、掩码与布尔逻辑 本文介绍如何使用布尔掩码来检查和操…...

力扣HOT100之二分查找:35. 搜索插入位置

这道题属于是二分查找的入门题了&#xff0c;我依稀记得一些二分查找的编码要点&#xff0c;但是最后还是写出了一个死循环&#xff0c;无语(ˉ▽ˉ&#xff1b;)…又回去看了下自己当时的博客和卡哥的视频&#xff0c;这才发现自己分情况只分了两种&#xff0c;最后导致死循环…...