【C++】 STL(上)STL简述、STL容器

news2024/9/26 3:31:30

文章目录

      • 简述
      • STL容器
        • list链表
        • vector向量
        • deque双端队列
        • map映射表
        • set集合
        • hash_map哈希表

简述

STL是“Standard Template Library”的缩写,中文译为“标准模板库”。STL是C++标准库的一部分,位与各个C++的头文件中,即他并非以二进制代码的形式提供,而是以源码的形式提供。STL体现了泛型编程的思想,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或近似的方式处理各种不同情形,为我们提供了一个可扩展的应用框架,高度体现了程序的可复用性。STL的一个重要特点是数据结构和算法的分离。

STL的头文件都不加扩展名,且打开std命名空间。

包含了六大组件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmEqUrg0-1686553741440)(C++.assets/image-20230530214549154.png)]

STL容器

主要分为两大类:

序列性容器:序列容器保持插入元素的原始顺序。允许指定在容器中插入元素的位置。每个元素都有固定位置,取决于插入时机和地点,和元素值无关,如:链表(list),向量(vector),双端队列(deque)。

关联性容器:元素位置取决于特定的排序规则和插入顺序无关,map、hash-map、set。容器类自动申请和释放内存,无需new和delete操作。

list链表

STL链表是序列性容器的模板类,它将其元素保持在线性排列中,链式结构,并允许在队列中的任何位置进行有效的插入和删除。

特点:list在任何指定位置动态的添加删除效率不变,时间复杂度为O(1),操作相比于vector比较方便。但其查找效率为O(n),若想访问、查看、读取数据使用vector。

双向循环链表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZyyPPwM-1686553741440)(C++.assets/image-20230530215305514.png)]

require:#include using namespace std;

构造链表的几种方式

空链表:

list<int> lst;

构建指定长度的链表,且有默认的初始值

list<int> lst(3);

构建了指定长度的链表,手动指定初始值

list<int> lst(3, 4);

使用初始化列表进行构建 类似new int[3]{1,2,3};

list<int> lst{ 2,3,4 };

链表中的一些方法

  1. begin():获取头节点的迭代器。end():获取尾节点的迭代器。
  2. front():返回头节点里的值。back():返回尾节点里的值。
  3. clear():清空链表。
  4. size():返回链表的长度、元素的数量。
  5. bool empty(),链表是否为空。
  6. erase():删除指定迭代器位置的节点,返回的是删除节点的下一个节点的迭代器。insert():指定迭代器位置插入一个元素,返回的是插入的元素的迭代器。

insert():

	list<int>::iterator ite = lst.insert(lst.begin(), 1);  //在指定位置之前
	for (int v : lst) {
		cout << v << "  ";
	}
	cout << endl;
	cout << "ite = " << *ite << endl;  //返回的是增加的

erase():

	ite++;
	ite = lst.erase(ite);//返回的是删除的下一个
	for (int v : lst) {
		cout << v << "  ";
	}
	cout << endl;
	if (ite != lst.end()) {  
		cout << "ite = " << *ite << endl;    //ite=3
	}

注意:如果我们删除的是最后一个值,那么ite返回的就是尾节点,但是尾节点中没有元素,强行获取元素就会崩,所以要加一个判断

  1. push_back()、push_front()、pop_back()、pop_front():链表头尾添加、删除。
  2. remove(const Type&_Val):将值为val的所有节点删除。

将值为4的所有节点移除:

lst.remove(4);
  1. unique():对连续而相同的节点移除只剩一个。
	lst.push_back(0);
	lst.push_back(0);
	lst.push_back(1);
	lst.push_back(2);
	lst.push_back(0);

	lst.unique();  //连续且相同,移除只剩一个
	for (int v : lst) {
		cout << v << "  ";
	}
	cout << endl;
  1. sort():对链表元素进行排序,默认升序。如果要指定排序规则,需要指定排序规则函数。bool func(Type,Type);或greater()降序,less()升序。

默认:

	lst2.sort();  //默认升序
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

指定规则:

bool rule(int a, int b) {
	return a > b;
}

	lst2.sort(&rule); //指定规则
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

greater/less(降序/升序)

	lst2.sort(less<int>()/*greater<int>()*/);   
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;
  1. reverse():链表进行翻转。
	lst2.reverse();   //翻转链表
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;
  1. **剪切拷贝整个链表:**splice(iterator Where,list& Right):将Right链表整个结合到另一个链表Where位置之前,这是一个剪切操作,Right链表将为空。
	list<int> lst3{ 1,10,5 };

	ite = lst2.begin();
	
	::advance(ite, 3);   //ite+=3
	lst2.splice(ite, lst3);  //将lst3 整个链表放到 3位置之前 ,剪切操作
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

	cout << "size = " << lst3.size() << endl;  //size = 0

这里我们了解到了一个函数:advance();它可以用来偏移迭代器,正常我们只能通过++来偏移,如果想偏移多个就要用循环,而不能用+=,那么我们就可以用这个方法

**剪切拷贝链表某个节点:**splice(iterator Where,list& Right,iterator First):将Right链表的First位置节点结合到this链表的Where位置之前,这是一个剪切操作。this和Right可以为同一个链表。

	lst2.splice(ite, lst3, lst3.begin());
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

	for (ite = lst3.begin(); ite != lst3.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

**剪切拷贝链表的某一段节点:**splice(iterator Where,list& Right,iterator First,iterator Last):将Right链表的First位置到Last位置的一段元素[First,Last),不包含Last,结合到this链表的Where位置之前,这是一个剪切操作。this和Right可以为同一个链表,但Where不能位于[First,Last)内。

	lst2.splice(ite, lst3, lst3.begin(), --lst3.end());
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

	for (ite = lst3.begin(); ite != lst3.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;
  1. merge(list& Right,Traits Comp):将Right链表合并到this链表上,this和Right必须经过排序,两者或都为递增、或都为递减,Comp描述了递增合并还是递减合并,bool func(Type,Type);或greater()降序,less()升序。这是一个剪切操作,Right将为空链表。

升序:

	lst2.sort();
	lst3.sort();

	lst2.merge(lst3);   //合并 剪切操作
	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

	cout << "size = " << lst3.size() << endl;

降序:

	lst2.sort(greater<int>());
	lst3.sort(greater<int>());
	lst2.merge(lst3,greater<int>());

	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

	cout << "size = " << lst3.size() << endl;
  1. swap(list& Rigth):交换两个链表。
	lst2.swap(lst3);

	for (ite = lst2.begin(); ite != lst2.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

	for (ite = lst3.begin(); ite != lst3.end(); ite++) {
		cout << *ite << "  ";
	}
	cout << endl;

vector向量

vector的行为类似于数组(array),但是其容量会随着需求自动增长(动态数组)向量在尾部的push和pop操作时间是恒定的.在向量的中间insert或erase元素需要线性时间在序列结尾插入、删除操作比开始位置性能要优越。

当向量元素增加超过当前的存储容量时,会发生重新分配操作。重载了[]操作符,就意味着它可以像数组一样使用[下标]访问元素。

特点:数据的存储访问比较方便,可以像数组一样使用[index]访问或修改值,适用于对元素修改和查看比较多的情况,对于insert或erase比较多的操作,很影响效率,不建议使用vector。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvRp2O5x-1686553741441)(C++.assets/image-20230611224520275.png)]

构造向量

require:#include using namespace std;

vector(size_type Count)。vector(size_type Count,const Type& Val)。构造函数,构造指定长度的向量并设定初始值。有默认值。

空向量:

vector<int> vec;

指定向量的容量,默认值为0:

vector<int> vec(3);

指定向量的容量,并且指定默认值:

vector<int> vec(3, 1);

初始化列表初始化向量:

vector<int> vec{ 1,2,3 };

向量中的方法:

  1. begin(),end(),返回向量头尾元素的迭代器。
  2. front(),back(),返回头尾元素中的值。
  3. size(),返回向量的使用量,capacity(),返回向量的容量。
  4. push_back(),pop_back(),在向量尾部添加删除,当用push_back向vector尾部加元素的时候,如果当前的空间不足,会重新申请一块更大的空间。pop_back删除时,使用量减少,但容量不会减少。不同于list,并没有提供push_front()和pop_front()。
  5. insert(const_iterator Where,const Type& Val),向量的某个位置之前插入指定值。insert(const_iterator Where,size_type Count,const Type& Val)。向量的某个位置之前插入count个指定值。 返回插入元素的迭代器,size会增加。
ite = vec.insert(vec.begin(), 0);
  1. erase(count_iterator Where),删除迭代器指向的元素,返回的是删除元素的下一个元素的迭代器。size减少,capacity不变。
	ite = vec.begin() + 3;
	//ite += 3;
	ite = vec.erase(ite);

向量中的迭代器可以有+,+=操作

  1. clear(),清空向量元素,size使用量为0,capacity不变。
  2. empty(),向量是否为空,描述的是使用量(size)。
  3. resize(size_type Newsize),resize(size_type _Newsoze,Type _Val)。为向量指定新的使用量,如果使用量减少,元素按顺序截取,但容量不变;如果使用量增加,则会有默认值0;如果使用量增加大于原容量,则扩展容量,有默认值,也可以指定新的扩展元素的值。
  4. swap(vector& Right),交换两个向量的元素。
	vector<int>  v1(3);
	vec.swap(v1);

可以利用交换将向量中的使用量和容量都清零

vector<int>().swap(vec);

对比 list 和 vector :

  1. vector是连续性空间,是顺序存储,list是链式结构体,链式存储。
  2. vector在非尾部插入、删除节点会导致其他元素的拷贝移动,list则不会影响其他节点元素。
  3. vector一次性分配好内存,使用量不够时,申请内存重新分配。list每次插入新节点时都会申请内存。
  4. vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。
  5. vector具有容量和使用量的概念,而list只有使用量(即长度)概念。

deque双端队列

deque没有容量的观念。它是动态以分段连续空间组合而成,一旦有必要在deque的前端和尾端增加新空间,串接在整个deque的头端或尾端,deque的迭代器不是普通的指针,其复杂度比vector复杂的多。除非必要,我们应该尽量选择使用vector而非deque。

deque是一种双向开口的连续性空间,可在头尾两端分别做元素的插入和删除操作。

deque模型图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P1gn5EWD-1686553741441)(C++.assets/image-20230611233419099.png)]

构造双端队列:

require:#include using namespace std;

deque(size_type Count),deque(size_type_Count,const Type& Val),构造函数,构造指定长度的向量并设定初始值。有默认值。

同样也是有三种构造方法(指定元素个数给定默认值,手动给值,初始化参数列表)。

deque<int> de{ 1,2,3,4 };

方法:

  1. push_back()、push_front()、pop_back()、pop_front()。
  2. begin()、end()、back()、front()、erase()、insert()。
  3. size()、empty()、clear(),支持[]下标访问,所以可以使用下标遍历。

双端队列的几种遍历方法:

下标:

	for (int i = 0; i < de.size(); i++) {
		cout << de[i] << "  ";
	}
	cout << endl;

增强的范围for:

	for (int v : de) {
		cout << v << "  ";
	}
	cout << endl;

迭代器遍历:

	deque<int>::iterator ite = de.begin();
	while (ite != de.end()) {
		cout << *ite << "  ";
		ite++;
	}

map映射表

Map的特性是,所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有键值(key)和实值(value)。pair的第一元素被视为键值,第二元素被视为实值。Map不允许两个元素拥有相同的键值,Map的键值关系到Map的元素排列规则,任意改变Map的元素键值将严重破坏Map的组织。所以不可以通过Map的迭代器来改变Map的键值。但可以通过迭代器来修改元素的实值。

查找效率:O(log2(n)),内部实现红黑树。

map模型图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwJCq73e-1686553741441)(C++.assets/image-20230612121457200.png)]

构造:

require:#include using namespace std;

map<char, int>  mm{ {'d',1},{'f',2},{'b',3} };

可以直接使用key值增加元素:

mm['c'] = 4;

方法:

  1. begin()、end(),支持迭代器遍历。
	map<char, int> ::iterator ite = mm.begin();
	while (ite != mm.end()) {
		cout << ite->first << "-" << ite->second << "  ";
		ite++;
	}
	cout << endl;
  1. pair<iterator,bool>insert(value_type& Val),插入一个元素,如果key值重复,则插入失败。iterator erase(iterator Where),返回删除的下一个。(没有push和pop的插入删除)。

插入:

	pair<map<char, int> ::iterator,bool> pr =  mm.insert(pair<char, int>('a', 5));  //插入成功,返回true,迭代器指向新增的元素
	if (pr.second) {
		cout << "插入成功" << endl;   //插入成功
	}
	else {
		cout << "插入失败" << endl;
	}
	cout << pr.first->first << "--" << pr.first->second << endl;  

	pr = mm.insert(pair<char, int>('a', 6));  //插入失败,返回false,迭代器指向的是已存在的元素
	if (pr.second) {
		cout << "插入成功" << endl;
	}
	else {
		cout << "插入失败" << endl;  //插入失败
	}
	cout << pr.first->first << "--" << pr.first->second << endl;

删除:

	ite = ++mm.begin();
	ite = mm.erase(ite);
	for (pair<char, int> pr : mm) {
		cout << pr.first << "-" << pr.second << "  ";
	}
	cout << endl;
	if (ite != mm.end()) {
		cout << ite->first << "-" << ite->second << endl;
	}
  1. clear()、size()、empty()
  2. iterator find(const Key& Key)、按键值查找,未匹配到返回end(),count(const Key& Key),按键值统计元素,返回1或0。

通过键值查找删除元素:

	ite = mm.find('d');
	if (ite != mm.end()) {  //如果找到了元素,则删除
		ite = mm.erase(ite);
	}
	for (pair<char, int> pr : mm) {
		cout << pr.first << "-" << pr.second << "  ";
	}
	cout << endl;
  1. upper_bound(const Key& Key)、返回大于该键值的map的迭代器。lower_bound(const Key& Key),返回该键值或者大于该键值的map的迭代器。
	map<char,int>::iterator ite = mm.upper_bound('b');
	cout << ite->first << "-" << ite->second << endl;  //c-4
	ite = mm.lower_bound('b');
	cout << ite->first << "-" << ite->second << endl;  //b-3

如果upper_bound和lower_bound返回的迭代器相同,那么代表元素不存在

	char e = 'e';
	if (mm.upper_bound(e) == mm.lower_bound(e)) { //元素不存在
		cout << e << "不存在" << endl;
	}
	else {
		cout << e << "存在" << endl;
	}

set集合

所有元素都会根据元素的键值自动被排序,Set的元素Map那样可以同时拥有实值和键值,Set元素的简直就是实值,实值就是键值。Set不允许两个元素有相同的键值,因为Set元素值就是其键值,关系到Set元素的排列规则。如果任意改变Set的元素值,会严重的破坏Set组织。

查找效率:O(log2(n)),内部实现红黑树。

构造:

require:#include using namespace std;

set<int> st{ 4,1,6,3 };

因为没有实值键值的区分了,所以不能像map一样用[]去添加了

方法:

  1. begin()、end(),支持迭代器遍历。
	set<int>::iterator ite = st.begin();
	while (ite != st.end()) {
		cout << *ite << "  ";
		ite++;
	}cout << endl;
  1. pair<iterator,bool>insert(const value_type& Val),插入一个元素,如果key值重复,则插入失败。iterator erase(iterator Where),返回删除的下一个。
	pair<set<int>::iterator,bool> pr = st.insert(6);
	if (!pr.second) {
		cout << "插入失败" << endl;
	}
	cout << *pr.first << endl;
  1. clear()、size()、empty()。
  2. iterator find(const Key& Key)、按键值查找,未匹配到返回end(),count(const Key& Key),按键值统计元素,返回1或0。
	ite = st.find(44);
	if (ite == st.end()) {
		cout << "没找到" << endl;
	}
  1. upper_bound(const Key& Key)、返回大于该键值的set的迭代器。lower_bound(const Key& Key),返回该键值或者大于该键值的set的迭代器。

hash_map哈希表

基于hash table(哈希表),数据的存储和查找效率非常高,几乎可以看作常量时间,相应的代价是消耗更多的内存。使用一个较大的数组来存储元素,经过算法,使得每个元素与数组下标有唯一的对应关系,查找时直接定位。

查找效率O(1)。

构造:

require:#include<hash_map> using namespace std;

若高版本需要 #define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 来去除error,或使用<unordered_map>

#include<unordered_map>
using namespace std;
	unordered_map<string, int>  mm;
	mm["aa"] = 1;
	mm["ff"] = 2;
	mm["oo"] = 3;
	mm["cc"] = 4;

方法:

  1. begin()、end(),返回头、尾节点的迭代器。支持迭代器遍历。
	unordered_map<string, int>::iterator ite = mm.begin();
	while (ite != mm.end()) {
		cout << ite->first << "-" << ite->second << "  ";
		ite++;
	}
	cout << endl;

遍历结果为无序的

  1. pair<iterator,bool> insert(const value_type& Val),插入一个元素,如果key值重复,则插入失败。iterator erase(iterator Where),返回删除的下一个。
  2. iterator find(const Key& _Key),按照key值进行查找, 注意:查找速度,数据量,内存使用。
	ite = mm.find("cc");
	ite = mm.erase(ite);
	for (pair<string, int> pr : mm) {
		cout << pr.first << "-" << pr.second << "  ";
	}
	cout << endl;

	cout << ite->first << "-" << ite->second << endl;

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

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

相关文章

【Linux】解决Linux无法联网的一个小问题

今天使用在虚拟机VMware中使用Linux系统&#xff08;Centos7&#xff09;的时候&#xff0c;发现不能联网&#xff0c;找了很多办法也没有解决&#xff0c;甚至重新安装也没有解决&#xff0c;后来想起之前的解决方案。 要在任务管理器中打开&#xff0c;VMware的网络管理。

量子 金融,将改变游戏规则?

光子盒研究院 前言&#xff1a;如今&#xff0c;量子技术早已走出实验室、广泛赋能电力、化学、医学等各个领域&#xff1b;创新赛道上&#xff0c;加速奔跑的量子产业&#xff0c;将带来无限可能。现在&#xff0c;光子盒特开启「量子」专栏&#xff0c;一一解读量子技术将为下…

简易实现无缝切换自动轮播

原理 页面中设置一个父盒子 bannerBox&#xff0c;固定宽高&#xff0c;相当于一个窗口&#xff0c;超出部分隐藏bannerBox 内部设置一个图片盒子 imgBox&#xff0c;横向&#xff08;或纵向&#xff09;依次排列图片添加定时器&#xff0c;每隔一段时间&#xff0c;imgBox 向…

解决使用html标签自定义的按钮点击时有背景底色的问题

问题描述 如下图所示&#xff0c;点击按钮的瞬间&#xff0c;元素底部会出现一个背景色 解决方法 在点击产生背景色的元素的css样式上加上以下代码&#xff1a;-webkit-tap-highlight-color: transparent;

《Unix环境高级编程》/bin/sh: ./fixup.awk: Permission denied

我的代码是从http://www.apuebook.com/code3e.html下载的&#xff0c;先是在 使用cat /etc/redhat-release看到操作系统是CentOS Linux 7.6&#xff0c;使用uname -r看到内核是3.10.0-957.el7.x86_64。 在代码顶级目录下&#xff0c;执行make。 发现报错&#xff1a; ./fi…

软件测试-基础

目录 软件测试的生命周期 如何描述bug 定义bug的级别 bug的生命周期 如何发现更多的bug 软件测试的生命周期 软件测试的生命周期包括: 需求分析->测试计划->测试设计,测试开发->测试执行->测试评估 需求分析:测试人员了解需求,分析需求是否完整,是否正确合…

idea git项目错乱显示多个git项目记录

在项目的.idea文件夹下找到vcs.xml 删除无用的mapping&#xff0c;例如上图&#xff0c;删除…/的目录即可

面试官虐我千百遍,我仍待他如初恋,阿里、腾讯、蚂蚁金服Java技术面试及经验总结

能够进一线互联网公司&#xff0c;是大部分程序员奋斗的目标&#xff0c;有很多小伙伴可能因为学历望而止步&#xff0c;其实只要能力够&#xff0c;学历真的不是那么重要&#xff01; 今天给大家带来ATM(阿里巴巴&#xff0c;腾讯&#xff0c;蚂蚁金服)的Java面试真题&#x…

有效延缓痴呆症:延世大学发现梯度提升机模型能准确预测 BPSD 亚综合征

内容一览&#xff1a;随着人口老龄化程度不断加剧&#xff0c;痴呆症已经成为公共健康问题。目前医学界治疗该病还只能通过药物缓解&#xff0c;尚未发现治愈的有效方法&#xff0c;因此&#xff0c;预防痴呆症尤为紧迫。在这一背景下&#xff0c;延世大学的研究人员开发了多个…

90v转5v芯片

摘要&#xff1a;AH8691内置MOS降压型开关芯片&#xff1a;为电动车控制器供电、通信和太阳能充电设备充电提供解决方案 问&#xff1a;什么是AH8691芯片&#xff1f; 答&#xff1a;AH8691是一款内置MOS降压型开关芯片&#xff0c;可将输入电压范围从10V至100V降压转换为稳定…

软件测试必备7大技能

一、测试用例的编写 1.在测试中最重要的文档&#xff0c;他是测试工作的核心&#xff0c;是一组在测试时输入输出的标准&#xff0c;是软件需求的具体对照。编写测试用例&#xff0c;是测试人员的基本功&#xff0c;真正能写好的人并不多。 2.测试用例包含的内容&#xff1a;…

互联网医院牌照申请流程|互联网医院审批流程

​随着科技的不断进步和社会的发展&#xff0c;互联网医院已经成为了当前的热点。而互联网医院的准入门槛自然也就越来越高。如果您计划成立一个互联网医院&#xff0c;您需要了解申请互联网医院牌照所需要注意的方面以及申请的流程。 一、资质申请前的准备 1、立项阶段准备 …

Python实现ACO蚁群优化算法优化LightGBM分类模型(LGBMClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

拍卖房变卖什么意思

法拍房的起拍价一般是评估价的七折。但是有一种法拍房比较特殊&#xff0c;起拍价接近评估价的五折&#xff0c;而且竞争力度很小&#xff0c;基本都是以低价成交的。它&#xff0c;就是处于变卖阶段的法拍房。那么拍卖房变卖什么意思? 一、拍卖房变卖什么意思  人民法院对查…

Linux之快捷键使用

目录 Linux之快捷键使用 histot 定义 用法 选项及作用 参数 断开长命令行 在一行输入多个命令 快捷方式 引用上一条命令的最后一个参数 --- !$ 实现生产环境中&#xff0c;history命令记录操作时间、操作用户、操作IP 1./etc/profile文件中加入以下内容 2.执行 source…

数字孪生是智慧城市管理的新引擎

数字孪生是一种创新的技术和概念&#xff0c;随着技术成熟逐渐为智慧城市管理带来深远的影响。数字孪生将物理世界与数字世界相结合&#xff0c;通过建立物理实体的数字模型&#xff0c;实现对城市各个方面的实时监测、分析和优化。数字孪生在智慧城市管理中扮演着关键的角色&a…

《Spark篇》------ Spark基础

目录 一、Spark简介 1.1、Spark是什么 1.2、Spark的特点 1.3、Spark生态系统 1.4、Spark Core的组件 1.5、Spark的安装流程 1.5.1、基础环境&#xff0c;安装Linux系统、Java环境和Hadoop环境 1.5.2、下载Spark文件并解压缩 1.5.3、编辑profile 1.5.4、Spark-shell运…

小程序 WEUI 隐藏导航栏使用自定义导航栏时Toptips在顶部显示

使用weui的toptips时候&#xff0c;我们的导航栏使用了自定义&#xff0c;高度根据系统来定的&#xff0c;然后使用form表单验证提示弹窗时&#xff0c;会在最上面被遮挡了。 需要使用weui ext-class 来实现穿透修改样式。 ext-class的top使用继承父元素的top即可 <mp-top…

将数组起始地址定向到SRAM2及错误L6220E的排查

今天有个程序要定义两个大数组&#xff0c;一个32k&#xff0c;一个16k。直接编译的话发现通不过&#xff0c;大概是提示空间不够。因为两个数组就占了48k&#xff0c;可是我的STM32L431CB有64k的RAM&#xff0c;怎么会不够呢&#xff1f;查了资料发现这个芯片的SRAM分为两块&a…

银河麒麟kylin v10 apt deb包问题记录

银河麒麟kylin v10 apt deb包问题记录 https://www.kylinos.cn/support/document/48.html 该补丁支持银河麒麟桌面操作系统V10 2101、V10 0402、V10 0416版本升级到银河麒麟桌面操作系统V10 2107。 下载链接如下 &#xff08;1&#xff09;官网下载链接&#xff1a; AMD64…