C++系列-STL容器之vector

STL概念

  • vector基本概念
    • vector与数组的区别
    • vector容器的特点
      • 动态大小
      • 连续存储
      • 自动扩容
      • 尾部操作高效
    • vector动态扩展的含义
    • vector常用的接口示意
  • vector的构造函数
  • vector赋值操作
    • =重载赋值
    • assign赋值
  • vector的容量和大小
  • vector的插入和删除
  • vector数据存取
  • vector互换容器
    • vector互换容器的使用方法
    • vector互换容器的用途
  • vector预留空间

vector基本概念

  • vector数据结构和数组非常相似,也称为单端数组。
  • vector也是一种顺序容器,在内存中连续排列。

vector与数组的区别

  • 数组是静态空间,定义好之后,长度确定。
  • vector可以动态扩展。由于其大小(size)可变,常用于数组大小不可知的情况下来替代数组。

vector容器的特点

动态大小

  • vector容器的大小可以根据需要进行动态调整。
  • 可以在运行时根据实际需求添加或删除元素,而无需在编译时确定容器的大小。
  • vector容器会自动处理内存管理。

连续存储

  • vector容器中的元素在内存中是连续存储的。
  • 可以通过下标来访问容器中的元素,并且支持快速的随机访问。

自动扩容

  • 当向vector容器中添加元素时,如果容器的当前大小不足以容纳新元素,容器会自动扩容。
  • 扩容是通过重新分配内存并将原有元素复制到新内存空间中来实现的。
  • 这种自动扩容的特性使得vector容器能够动态地适应元素的增长。

尾部操作高效

  • vector容器中的元素是连续存储的,因此在尾部进行插入和删除操作是高效的。
  • 这是因为在尾部插入或删除元素时,不需要移动其他元素,只需调整尾部指针即可。

vector动态扩展的含义

  • 并不是在在原空间后面续接新的空间,而是开辟一个更大的空间,将原数据拷贝到新空间,并删除原空间。

vector常用的接口示意

  • 迭代器v.begin():起始元素的位置, v.end(): 最后一个元素之后的位置。
  • 迭代器v.rbegin():末尾元素的位置, v.rend(): 第一个元素之前的位置。
  • front(): 第一个元素,back(): 末尾元素。
  • push_back(): 末尾添加元素,pop_back(): 末尾删除元素。
  • vector的迭代器是支持随机访问的迭代器,也就是说迭代器可以一下跳好几个。
    在这里插入图片描述

vector的构造函数

  • vector v: 采用模板类实现,默认构造函数。
  • vector(v.begin(), v.end()): 将v对象从v.begin()到 v.end()之间的元素拷贝给正在创建的对象,包头不包尾。
  • vector(n, elem): 将n个elem拷贝给正在创建的对象。
  • vector(const vector &vec): 拷贝构造函数。
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int> &vec)
{for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{vector<int> arr1;								// 一个空数组arr1.push_back(11);arr1.push_back(22);cout << "---------- arr1 ----------";print_vector(arr1);vector<int> arr2 {1, 2, 3, 4};					// 包含1、2、3、4这4个元素cout << "---------- arr2 ----------";print_vector(arr2);vector<int> arr3(4);							// 开辟4个空间,值默认为0cout << "---------- arr3 ----------";print_vector(arr3);vector<int> arr4(5, 3);							// 5个值为3的数组cout << "---------- arr4 ----------";print_vector(arr4);vector<int> arr5(arr3);							// 将arr3的所有值复制进去,array5和arr3一样cout << "---------- arr5 ----------";print_vector(arr5);vector<int> arr6(arr2.begin(), arr2.end());		// 将arr2的值从头开始到尾复制cout << "---------- arr6 ----------";print_vector(arr6);vector<int> arr7(arr2.rbegin(), arr2.rend());	// 将arr2的值从尾到头复制cout << "---------- arr7 ----------";print_vector(arr7);
}
int main()
{test01();system("pause");return 0;
}result:
---------- arr1 ----------11 22
---------- arr2 ----------1 2 3 4
---------- arr3 ----------0 0 0 0
---------- arr4 ----------3 3 3 3 3
---------- arr5 ----------0 0 0 0
---------- arr6 ----------1 2 3 4
---------- arr7 ----------4 3 2 1

vector赋值操作

=重载赋值

  • 函数原型 vector& operator=(const vector &vec), 重载等号运算符

assign赋值

  • v1.assign(beg迭代器,end迭代器), 将[beg迭代器,end迭代器) 之间的数据拷贝给被赋值的对象。
  • v1.assign(n,elem), 将n个elem的数据拷贝给被赋值的对象。
code:
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int>& vec)
{for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{vector<int> arr1{0,1,2,3,4,5,6,7,8,9};cout << "---------- arr1 ----------" << endl;print_vector(arr1);vector<int> arr2;arr2 = arr1;			// 直接用cout << "---------- arr2 ----------" << endl;print_vector(arr2);arr2.pop_back();arr2.pop_back();vector<int> arr3;arr3.assign(5, 3);		// 函数重载,将5个3赋值给arr3cout << "---------- arr3 ----------" << endl;print_vector(arr3);vector<int> arr4;arr4.assign(arr1.begin(), arr1.end()-4);	// 函数重载,迭代器参数, 迭代器可以加减操作cout << "---------- arr4 ----------" << endl;print_vector(arr4);
}
int main()
{test01();system("pause");return 0;
}result:
---------- arr1 ----------
0 1 2 3 4 5 6 7 8 9
---------- arr2 ----------
0 1 2 3 4 5 6 7 8 9
---------- arr3 ----------
3 3 3 3 3
---------- arr4 ----------
0 1 2 3 4 5

vector的容量和大小

函数原型用途
empty()判断容器是否为空
capacity()容器的容量,容量>=size
size()返回容器中元素的个数
resize(int num)重新指定容器的长度(size)为num,若容器变长,则以默认数值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
resize(int num,elem)重新指定容器的长度(size)为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int>& vec)
{for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{vector<int> arr1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};cout << "---------- arr1 ----------" << endl;print_vector(arr1);vector<int> arr2;cout << "---------- arr2 ----------" << endl;print_vector(arr2);// 判断容器是否为空if (arr1.empty()){printf("arr1 is empty");}else{cout << "arr1.capacity: " <<  arr1.capacity() << ", arr1.size: " << arr1.size() << endl;}if (arr2.empty()){printf("arr2 is empty\n");}	vector<int> arr3;arr3.assign(arr1.begin(), arr1.end());		// assign赋值迭代器参数cout << "---------- arr3 ----------" << endl;print_vector(arr3);cout << "arr3.capacity: " << arr3.capacity() << ", arr3.size: " << arr3.size() << endl;arr3.resize(7);			// resize为7,size比原数组短,超出部分删除,size减小,capacity不变cout << "---------- arr3.resize(7) ----------" << endl;print_vector(arr3);cout << "arr3.capacity: " << arr3.capacity() << ", arr3.size: " << arr3.size() << endl;arr3.resize(9);		// resize为10,size比原数长,超出部分填充0,size增加cout << "---------- arr3.resize(9) ----------" << endl;print_vector(arr3);cout << "arr3.capacity: " << arr3.capacity() << ", arr3.size: " << arr3.size() << endl;arr3.resize(16, 666);	// resize为16,size比原数组长,超出部分填充,size增大,自动扩展capacitycout << "---------- arr3.resize(16, 666); ----------" << endl;print_vector(arr3);cout << "arr3.capacity: " << arr3.capacity() << ", arr3.size: " << arr3.size() << endl;}
int main()
{test01();system("pause");return 0;
}reult:
---------- arr1 ----------
0 1 2 3 4 5 6 7 8 9
---------- arr2 ----------arr1.capacity: 10, arr1.size: 10
arr2 is empty
---------- arr3 ----------
0 1 2 3 4 5 6 7 8 9
arr3.capacity: 10, arr3.size: 10
---------- arr3.resize(7) ----------
0 1 2 3 4 5 6
arr3.capacity: 10, arr3.size: 7
---------- arr3.resize(9) ----------
0 1 2 3 4 5 6 0 0
arr3.capacity: 10, arr3.size: 9
---------- arr3.resize(16, 666); ----------
0 1 2 3 4 5 6 0 0 666 666 666 666 666 666 666
arr3.capacity: 16, arr3.size: 16

vector的插入和删除

函数原型用途
push_back(ele)尾部插入元素ele
pop_back(ele)尾部删除
insert(const_iterator pos, ele)迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count, ele)迭代器指向位置pos插入count元素ele
erase(const_iterator pos)删除迭代器指向的元素
erase(const_iterator start, const_iterator end)删除迭代器从start到end之间的元素
clear()删除容器中所有元素
code:
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int>& vec)
{for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++){cout << *it << " ";}cout << endl;
}
void test01()
{vector<int> v1;v1.push_back(11);		// 尾插v1.push_back(22);v1.push_back(33);cout << "---------- v1尾插 ----------" << endl;print_vector(v1);v1.pop_back();			// 尾删cout << "---------- v1尾删 ----------" << endl;print_vector(v1);v1.insert(v1.begin()+1, 666);	// 在迭代器指示的位置插入666cout << "---------- v1.insert(v1.begin()+1,666) ----------" << endl;print_vector(v1);v1.insert(v1.begin(), 5, 666);	// 在迭代器指示的位置插入5个666cout << "---------- v1.insert(v1.begin(), 3, 888) ----------" << endl;print_vector(v1);v1.erase(v1.begin());			// 删除迭代器指示的位置的元素cout << "---------- v1.erase(v1.begin()) ----------" << endl;print_vector(v1);v1.erase(v1.begin(), v1.end()-2);	// 删除迭代器指示的区域cout << "---------- v1.erase(v1.begin(), v1.end()-2) ----------" << endl;print_vector(v1);v1.clear();		// 清空cout << "---------- v1.clear() ----------" << endl;print_vector(v1);
}
int main()
{test01();system("pause");return 0;
}result:
---------- v1尾插 ----------
11 22 33
---------- v1尾删 ----------
11 22
---------- v1.insert(v1.begin()+1,666) ----------
11 666 22
---------- v1.insert(v1.begin(), 3, 888) ----------
666 666 666 666 666 11 666 22
---------- v1.erase(v1.begin()) ----------
666 666 666 666 11 666 22
---------- v1.erase(v1.begin(), v1.end()-2) ----------
666 22
---------- v1.clear() ----------

vector数据存取

函数原型用途
at(int idx)返回索引idx所指的数据
operator[]返回索引idx所指的数据
front()返回容器中的第一个数据元素
back()返回容器中的最后一个数据元素
code:
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int>& vec)
{for (int i_loop = 0; i_loop < vec.size(); i_loop++){cout << vec[i_loop] << " ";		// 使用[]重载访问}cout << endl;
}void print_vector_at(vector<int>& vec)
{for (int i_loop = 0; i_loop < vec.size(); i_loop++){cout << vec.at(i_loop) << " ";		// 使用v1.at(index)访问元素}cout << endl;
}void test01()
{vector<int> v1{11, 22, 33, 44, 55, 66};print_vector(v1);print_vector_at(v1);cout << "vector容器中的第一个元素: " << v1.front() << endl;cout << "vector容器中的最后一个元素: " << v1.back() << endl;}
int main()
{test01();system("pause");return 0;
}result:
11 22 33 44 55 66
11 22 33 44 55 66
vector容器中的第一个元素: 11
vector容器中的最后一个元素: 66

vector互换容器

  • 实现两个容器内元素互换
  • v1.swap(vec), v1与vec中的元素互换

vector互换容器的使用方法

code:
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int>& vec)
{for (vector<int>::iterator it=vec.begin(); it<vec.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{vector<int> v1{11, 22, 33, 44, 55, 66};vector<int> v2{99, 88, 66, 77};cout << "---------- swap前 ----------" << endl;cout << "v1中的元素:";print_vector(v1);cout << "v1.capacity: " << v1.capacity() << ", v1.size: " << v1.size() << endl;cout << "v2中的元素:";print_vector(v2);cout << "v2.capacity: " << v2.capacity() << ", v2.size: " << v2.size() << endl;cout << "\n---------- swap后 ----------" << endl;v1.swap(v2);cout << "v1中的元素:";print_vector(v1);cout << "v1.capacity: " << v1.capacity() << ", v1.size: " << v1.size() << endl;cout << "v2中的元素:";print_vector(v2);cout << "v2.capacity: " << v2.capacity() << ", v2.size: " << v2.size() << endl;
}
int main()
{test01();system("pause");return 0;
}result:
---------- swap前 ----------
v1中的元素:11 22 33 44 55 66
v1.capacity: 6, v1.size: 6
v2中的元素:99 88 66 77
v2.capacity: 4, v2.size: 4
---------- swap后 ----------
v1中的元素:99 88 66 77
v1.capacity: 4, v1.size: 4
v2中的元素:11 22 33 44 55 66
v2.capacity: 6, v2.size: 6

vector互换容器的用途

  • 可以用来收缩内存空间
    请从以下代码中一窥究竟。
code:
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int>& vec)
{for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{vector<int> v1;// 系统在开辟空间时会不断给尝试,所以capacity的值不一定是10000for (int i_loop = 0; i_loop < 10000; i_loop++)	{v1.push_back(i_loop);}cout << "---------- swap前 ----------" << endl;cout << "v1.capacity: " << v1.capacity() << ", v1.size: " << v1.size() << endl;v1.resize(3);		// 后面的数据删除,size会变小,但是capacity不会cout << "---------- v1.resize(3) ----------" << endl;print_vector(v1);cout << "v1.capacity: " << v1.capacity() << ", v1.size: " << v1.size() << endl;// vector<int>(v1)是创建匿名对象temp(实际没名字),会按照v1的实际size创建匿名对象,会自动将capacity缩小为size,// 然后temp.swap(v1),v1和temp做容器交换,将v1的capacity缩小了。// 当这条语句执行完之后,系统发现是匿名对象,会将其删掉,所以不会一直占用空间。vector<int>(v1).swap(v1);	cout << "\n---------- swap后 ----------" << endl;cout << "v1.capacity: " << v1.capacity() << ", v1.size: " << v1.size() << endl;
}
int main()
{test01();system("pause");return 0;
}result:
---------- swap前 ----------
v1.capacity: 12138, v1.size: 10000
---------- v1.resize(3) ----------
0 1 2
v1.capacity: 12138, v1.size: 3---------- swap后 ----------
v1.capacity: 3, v1.size: 3

vector预留空间

  • 减少vector在动态扩展容量时的扩展次数
    且看下面的代码:
code:
void test01()
{int num = 0;vector<int> v1;int* pt = NULL;// 系统在开辟空间时会不断给尝试,开辟一次不够,就重新开辟,每次开辟是会找一块新的区域for (int i_loop = 0; i_loop < 10000; i_loop++){v1.push_back(i_loop);if (&v1[0] != pt)		// 判断是否是一次重新开辟的空间{pt = &v1[0];num++;}}cout << "num: " << num << endl;
}
int main()
{test01();system("pause");return 0;
}result:
num: 24

从代码中可以看出,空间一共开辟了24次,当然也伴随着旧的空间释放,这些操作其实就是浪费资源。
试问怎么解决呢?且看下面代码

code:
#include <iostream>
#include <vector>
using namespace std;void print_vector(vector<int>& vec)
{for (vector<int>::iterator it = vec.begin(); it < vec.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{int num = 0;vector<int> v1;v1.reserve(10000);		// reserve找10000大的空间,给v1预留着int* pt = NULL;// 系统在开辟空间时会不断给尝试,开辟一次不够,就重新开辟,每次开辟是会找一块新的区域for (int i_loop = 0; i_loop < 10000; i_loop++){v1.push_back(i_loop);if (&v1[0] != pt)		// 判断是否是一次重新开辟的空间{pt = &v1[0];num++;}}cout << "num: " << num << endl;
}
int main()
{test01();system("pause");return 0;
}result:
num: 1

从代码中可以看出,空间一共开辟了1次,这是因为使用v1.reserve(空间大小),系统会先预留一片空间,如果没超出,就不会开辟新的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/51581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache RocketMQ 批处理模型演进之路

作者&#xff1a;谷乂 RocketMQ 的目标&#xff0c;是致力于打造一个消息、事件、流一体的超融合处理平台。这意味着它需要满足各个场景下各式各样的要求&#xff0c;而批量处理则是流计算领域对于极致吞吐量要求的经典解法&#xff0c;这当然也意味着 RocketMQ 也有一套属于自…

从开题到答辩:ChatGPT超全提示词分享!(上)【建议收藏】

在浩瀚的知识领域中&#xff0c;提问的艺术是探索真理的钥匙。在这个信息爆炸的时代&#xff0c;深入探索知识的海洋&#xff0c;不仅需要热情和毅力&#xff0c;更需要正确的方法和工具。学术研究是一个复杂而严谨的过程&#xff0c;涉及从选题、文献综述到研究设计、数据收集…

最新高仿拼夕夕源码/拼单系统源码/拼单商城/类目功能齐全

源码简介&#xff1a; 高仿拼夕夕源码&#xff0c;拼单商城系统源码、拼团商城源码&#xff0c;改的版本。拼夕夕拼团商城系统源码源码 多商户多区域拼团系统源码。 自己改的版本&#xff0c;类似于拼单的商城&#xff0c;功能齐全&#xff0c;看着还挺不错&#xff0c;绝对值…

macos 10.15 catalina xcode 下载和安装

在macos 10.15 catalina系统中, 由于系统已经不再支持,所以我们无法通过应用商店来安装xcode, 需要手动下载指定版本的 xcode 版本才能安装, catalina 支持的最新xcode版本为 Xcode v12.4 (12D4e) , 其他的新版本是无法安装在Catalina系统中的. Xcode_12.4.xip下载地址 注意,下…

RocketMQ第5集

一 RocketMQ的工作流程 1.1 生产环节producer Producer可以将消息写入到某Broker中的某Queue中&#xff1a;其中Producer发送消息之前&#xff0c;会先向NameServer发出获取消息Topic的路由信息的请求&#xff0c;NameServer返回该Topic的路由表及Broker列表。简单的说&…

火爆硅谷的“AI原生”代码编辑器Cursor使用体验

简单总结下&#xff1a; 如果现在你有需要改动到代码、有需要迅速了解一个开源项目的代码逻辑、或者对代码一直没有入门想要学习的话&#xff1a; 现在&#xff01;立刻&#xff01;马上&#xff01;下载体验使用cursor&#xff01;It‘s a life-saving decision&#xff01;…

排序算法见解(2)

1.快速排序 1.1基本思想&#xff1a; 快速排序是通过一趟排序将待排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排序过程可以递归进行&#xff0c;以…

IPv4地址和子网掩码

IP地址构成&#xff1a; IP 地址由 4 组 8 位二进制组成的&#xff0c;一共 32 位。 网络号和主机号&#xff1a; IP 地址由网络号和主机号组成。和第二张图片上一样&#xff0c;前面相同标蓝的就是网络号&#xff0c;不同的就是主机号。不同网络的通信需要通过路由器连接&…

Python简介、发展史

Python简介、发展史 本文目录&#xff1a; 零、时光宝盒 一、Python简介 二、Python设计者 三、Python发展史 四、Python语言的编程语言特性 五、Python现状 六、Python的未来 零、时光宝盒 我家所在的楼是3栋楼连接在一起的建筑&#xff0c;也就是3栋楼楼顶建筑上互通。…

mysql的半同步模式

1.半同步模式原理 mysql的主备库通过binlog日志保持一致&#xff0c;主库本地执行完事务&#xff0c;binlog日志落盘后即返回给用户&#xff1b;备库通过拉取主库binlog日志来同步主库的操作。默认情况下&#xff0c;主库与备库并没有严格的同步&#xff0c;因此存在一定的概率…

linux下一切皆文件,如何理解?

linux下一切皆文件&#xff0c;不管你有没有学过linux&#xff0c;都应该听过这句话&#xff0c;就像java的一切皆对象一样。 今天就来看看它的真面目。 你记住了&#xff0c;只要一个竞争退出它的PCB要被释放文件名&#xff0c;客服表也要被释放。那么&#xff0c;指向这个文件…

第100+23步 ChatGPT学习:概率校准 Sigmoid Calibration

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

0.0 C语言被我遗忘的知识点

文章目录 位移运算(>>和<<)函数指针函数指针的应用场景 strcmp的返回值合法的c语言实数表示sizeof 数组字符串的储存 —— 字符数组与字符指针字符串可能缺少 \0 的情况 用二维数组储存字符串数组其他储存字符串数组的方法 位移运算(>>和<<) 右移(>…

c++中的匿名对象及内存管理

c中的匿名对象 A a;//a的生命周期在整个main函数中 a.Sum(1); //匿名对象生命周期只有一行&#xff0c;只有这一行会创建对象,出了这一行就会调析构 A().Sum(1);//只有这一行需要这个对象&#xff0c;其他地方不需要。 return 0; 日期到天数的转换 计算日期到天数转换_牛客…

【鸿蒙样式初探】多个组件如何共用同一样式

最近开发鸿蒙&#xff0c;刚接触难免二和尚摸不着头脑&#xff0c;尤其是样式...... 背景 在做银行卡显示的一个小需求时&#xff1a; 每个Text都需要设置fontColor:#FFFFFF" 想着是否可以简单点 解决历程 思路一&#xff1a;&#xff08;拒绝) 使用Styles 提取封装公…

爆改YOLOv8|利用可改变核卷积AKConv改进yolov8-轻量涨点

1&#xff0c;本文介绍 AKConv&#xff08;可改变核卷积&#xff09;是一种改进的卷积操作方法&#xff0c;其核心在于动态调整卷积核的形状和大小。与传统卷积层固定核大小不同&#xff0c;AKConv 通过引入可学习的机制&#xff0c;使卷积核在训练过程中能够自适应地调整&…

学生宿舍管理小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;宿舍公告管理&#xff0c;学生管理&#xff0c;宿舍管理&#xff0c;后勤人员管理&#xff0c;楼栋信息管理&#xff0c;宿舍分配管理管理&#xff0c;退宿信息管理 微信端账号功能包括&#xff1a;系…

程序猿成长之路之数据挖掘篇——Kmeans聚类算法

Kmeans 是一种可以将一个数据集按照距离&#xff08;相似度&#xff09;划分成不同类别的算法&#xff0c;它无需借助外部标记&#xff0c;因此也是一种无监督学习算法。 什么是聚类 用官方的话说聚类就是将物理或抽象对象的集合分成由类似的对象组成的多个类的过程。用自己的…

idea import配置

简介 本文记录idea中import相关配置&#xff1a;自动导入依赖、自动删除无用依赖、避免自动导入*包 自动导入依赖 在编辑代码时&#xff0c;当只有一个具有匹配名称的可导入声明时&#xff0c;会自动添加导入 File -> Settings -> Editor -> General -> Auto Imp…

简而不减,极致便捷!泰极预付费解决方案震撼上市

开户麻烦!绑表复杂!用电情况模糊!电费收缴难! 在日常生活中,能源缴费可能经常会遇到运维难管理、缴费收益难计算、支付安全难保障等问题。如何解决呢?正泰物联推出“泰极预付费解决方案”,“简”操作,“不减”功能,有效解决上述问题,助力实现便捷生活。 享轻松:泰极简而不减…