《C++ vector 完全指南:vector的模拟实现》

《C++ vector 完全指南:vector的模拟实现》


文章目录

  • 《C++ vector 完全指南:vector的模拟实现》
  • 一、定义vector的成员变量
  • 二、用vector实现动态二维数组
  • 三、vector的接口实现
  • 1.vector的默认成员函数
    • (1)构造函数实现
    • (2)析构函数实现
    • (3)拷贝构造函数
    • (4)赋值运算符重载
  • 2.vector的迭代器实现
  • 3.vector的容量操作函数
  • 4.vector的访问操作函数
  • 5.vector的修改操作函数
  • 整体源代码介绍
    • vector.h
    • Test.cpp


一、定义vector的成员变量

vector的成员变量是三个迭代器,也可以说是三个指针。
在这里插入图片描述
在这里插入图片描述


二、用vector实现动态二维数组

在这里插入图片描述
在这里插入图片描述


三、vector的接口实现

1.vector的默认成员函数

(1)构造函数实现

我们就依次实现下面四种构造方式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


(2)析构函数实现

这里要注意对_start判空,因为空的时候就不用再析构!
在这里插入图片描述


(3)拷贝构造函数

这里也可以是构造函数,也是拷贝构造函数!
在这里插入图片描述


(4)赋值运算符重载

这里直接选择swap交换函数就OK
在这里插入图片描述


2.vector的迭代器实现

vector中迭代器iterator就是一个指针。所以我们直接使用typedef实现即可
begin()和end()本质上都是指针
在这里插入图片描述


3.vector的容量操作函数

size()、capacity()、clear()、empty()都很简单!一看就懂!
在这里插入图片描述


reverse()和string实现差不多,只要新容量大于旧容量就发生扩容!
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


4.vector的访问操作函数

这里面主要就是 数组的下表访问[ ]
在这里插入图片描述


5.vector的修改操作函数

这里面有:push_back 、 pop_back 、 insert 、 earse
push_back要考虑扩容的问题,前两个比较简单
在这里插入图片描述
在这里插入图片描述在这里插入图片描述


整体源代码介绍

vector.h

代码如下(示例):

#pragma once
#include<assert.h>
#include<list>
#include<string>namespace bit
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;vector(){}// C++11 前置生成默认构造vector() = default;vector(const vector<T>& v){reserve(v.size());for (auto& e : v){push_back(e);}}// 类模板的成员函数,还可以继续是函数模版template <class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}vector(size_t n, const T& val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}vector(int n, const T& val = T()){reserve(n);for (int i = 0; i < n; i++){push_back(val);}}void clear(){_finish = _start;}// v1 = v3//vector<T>& operator=(const vector<T>& v)//{//	if (this != &v)//	{//		clear();//		reserve(v.size());//		for (auto& e : v)//		{//			push_back(e);//		}//	}//	return *this;//}void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}// v1 = v3//vector& operator=(vector v)vector<T>& operator=(vector<T> v){swap(v);return *this;}~vector(){if (_start){delete[] _start;_start = _finish = _end_of_storage = nullptr;}}iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}void reserve(size_t n){if (n > capacity()){size_t old_size = size();T* tmp = new T[n];//memcpy(tmp, _start, old_size * sizeof(T));for (size_t i = 0; i < old_size; i++){tmp[i] = _start[i];}delete[] _start;_start = tmp;_finish = tmp + old_size;_end_of_storage = tmp + n;}}void resize(size_t n, T val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish < _start + n){*_finish = val;++_finish;}}}size_t size() const{return _finish - _start;}size_t capacity() const{return _end_of_storage - _start;}bool empty() const{return _start == _finish;}void push_back(const T& x){// 扩容if (_finish == _end_of_storage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;}void pop_back(){assert(!empty());--_finish;}iterator insert(iterator pos, const T& x){assert(pos >= _start);assert(pos <= _finish);// 扩容if (_finish == _end_of_storage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;--end;}*pos = x;++_finish;return pos;}void erase(iterator pos){assert(pos >= _start);assert(pos < _finish);iterator it = pos + 1;while (it != end()){*(it - 1) = *it;++it;}--_finish;}T& operator[](size_t i){assert(i < size());return _start[i];}const T& operator[](size_t i) const{assert(i < size());return _start[i];}private:iterator _start = nullptr;iterator _finish = nullptr;iterator _end_of_storage = nullptr;};/*void print_vector(const vector<int>& v){vector<int>::const_iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v){cout << e << " ";}cout << endl;}*/template<class T>void print_vector(const vector<T>& v){// 规定,没有实例化的类模板里面取东西,编译器不能区分这里const_iterator// 是类型还是静态成员变量//typename vector<T>::const_iterator it = v.begin();auto it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v){cout << e << " ";}cout << endl;}template<class Container>void print_container(const Container& v){/*auto it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;*/for (auto e : v){cout << e << " ";}cout << endl;}void test_vector1(){vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v){cout << e << " ";}cout << endl;print_vector(v);vector<double> vd;vd.push_back(1.1);vd.push_back(2.1);vd.push_back(3.1);vd.push_back(4.1);vd.push_back(5.1);print_vector(vd);}void test_vector2(){std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);print_container(v);/*v.insert(v.begin() + 2, 30);print_vector(v);*/int x;cin >> x;auto p = find(v.begin(), v.end(), x);if (p != v.end()){// insert以后p就是失效,不要直接访问,要访问就要更新这个失效的迭代器的值/*v.insert(p, 20);(*p) *= 10;*/p = v.insert(p, 40);(*(p + 1)) *= 10;}print_container(v);}void test_vector3(){std::vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);print_container(v);// 删除所有的偶数auto it = v.begin();while (it != v.end()){if (*it % 2 == 0){it = v.erase(it);}else{++it;}}print_container(v);}void test_vector4(){int i = int();int j = int(1);int k(2);vector<int> v;v.resize(10, 1);v.reserve(20);print_container(v);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(15, 2);print_container(v);v.resize(25, 3);print_container(v);v.resize(5);print_container(v);}void test_vector5(){vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);print_container(v1);vector<int> v2 = v1;print_container(v2);vector<int> v3;v3.push_back(10);v3.push_back(20);v3.push_back(30);v1 = v3;print_container(v1);print_container(v3);}void test_vector6(){vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(4);v1.push_back(4);vector<int> v2(v1.begin(), v1.begin() + 3);print_container(v1);print_container(v2);list<int> lt;lt.push_back(10);lt.push_back(10);lt.push_back(10);lt.push_back(10);vector<int> v3(lt.begin(), lt.end());print_container(lt);print_container(v2);vector<string> v4(10, "1111111");print_container(v4);vector<int> v5(10);print_container(v5);vector<int> v6(10u, 1);print_container(v6);vector<int> v7(10, 1);print_container(v7);}void test_vector7(){vector<string> v;v.push_back("11111111111111111111");v.push_back("11111111111111111111");v.push_back("11111111111111111111");v.push_back("11111111111111111111");print_container(v);v.push_back("11111111111111111111");print_container(v);}
}

Test.cpp

代码如下(示例):

#include<iostream>
#include<vector>
using namespace std;#include"vector.h"void test_vector1()
{vector<int> v1;vector<int> v2(10, 1);vector<int> v3(++v2.begin(), --v2.end());for (size_t i = 0; i < v3.size(); i++){cout << v3[i] << " ";}cout << endl;vector<int>::iterator it = v3.begin();while (it != v3.end()){cout << *it << " ";++it;}cout << endl;for (auto e : v3){cout << e << " ";}cout << endl;
}void TestVectorExpand()
{size_t sz;vector<int> v;v.reserve(100);sz = v.capacity();cout << "capacity changed: " << sz << '\n';cout << "making v grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}void test_vector2()
{//TestVectorExpand();vector<int> v(10, 1);v.reserve(20);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(15);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(5);cout << v.size() << endl;cout << v.capacity() << endl;
}void test_vector3()
{//TestVectorExpand();vector<int> v(10, 1);v.reserve(20);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(15, 2);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(25, 3);cout << v.size() << endl;cout << v.capacity() << endl;v.resize(5);cout << v.size() << endl;cout << v.capacity() << endl;
}void test_vector4()
{vector<int> v(10, 1);v.push_back(2);v.insert(v.begin(), 0);for (auto e : v){cout << e << " ";}cout << endl;v.insert(v.begin() + 3, 10);for (auto e : v){cout << e << " ";}cout << endl;vector<int> v1(5, 0);for (size_t i = 0; i < 5; i++){cin >> v1[i];}for (auto e : v1){cout << e << ",";}cout << endl;vector<char> v2;string s2;// \0vector<int> v3;// send(s2.c_str())
}void test_vector5()
{vector<int> v(5, 1);vector<vector<int>> vv(10, v);vv[2][1] = 2;// vv.operator[](2).operator[](1) = 2;for (size_t i = 0; i < vv.size(); i++){for (size_t j = 0; j < vv[i].size(); ++j){cout << vv[i][j] << " ";}cout << endl;}cout << endl;
}
int main()
{test_vector5();
}//template<class T>
//class vector
//{
//	T& operator[](int i)
//	{
//		assert(i < _size);
//
//		return _a[i];
//	}
//private:
//	T* _a;
//	size_t _size;
//	size_t _capacity;
//};// vector<int>
//class vector
//{
//	int& operator[](int i)
//	{
//		assert(i < _size);
//
//		return _a[i];
//	}
//private:
//	int* _a;
//	size_t _size;
//	size_t _capacity;
//};
//
//// vector<vector<int>>
//class vector
//{
//	vector<int>& operator[](int i)
//	{
//		assert(i < _size);
//
//		return _a[i];
//	}
//private:
//	vector<int>* _a;
//	size_t _size;
//	size_t _capacity;
//};//int main()
//{
//	bit::test_vector7();
//
//	return 0;
//}
//using namespace std;
//#include<vector>
//void Test1()
//{
//	vector<int> v = { 1,2,3,4,5,6,7,8 };
//	vector<int>::iterator it = v.begin();
//	cout << "顺序遍历:";
//	while (it != v.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//	cout << "逆序遍历:";
//	vector<int>::reverse_iterator rit = v.rbegin();
//	while (rit != v.rend())
//	{
//		cout << *rit << " ";
//		++rit;
//	}
//}
//void Test2()
//{
//	//1.默认构造函数初始化
//	vector<int> v1;
//	//2.n个val初始化
//	vector<int> v2(3, 2);
//	string s("abcd");
//	//3.利用迭代器区间初始化
//	vector<int> v3(s.begin(), s.end());
//	//4.拷贝构造
//	vector<int> v4(v3);
//	//5.赋值重载
//	v2 = v3;
//	//6.可变参数列表初始化
//	vector<int> v5 = { 1,2,3,4,5 };
//	//vector<char> v6 = v4;//error 不同类型不能赋值
//}
//void Test3()
//{
//	vector<int> v = { 1,2,3,4,5 };
//	cout << v.size() << endl;
//	cout << v.capacity() << endl;
//}
//void TestExpand()
//{
//	size_t sz;
//	vector<int> v;
//	sz = v.capacity();
//	cout << "making v grow:" << endl;
//	for (int i = 0; i < 100; ++i)
//	{
//		v.push_back(i);
//		if (sz != v.capacity())
//		{
//			sz = v.capacity();
//			cout << "capacity changed: " << sz << endl;
//		}
//	}
//}
//void Test4()
//{
//	vector<int> v1 = { 1,2,3,4,5 };
//	cout << "v1的有效长度为:" << v1.size() << endl;
//	cout << "v1的容量大小为:" << v1.capacity() << endl;
//	v1.reserve(10);
//	cout << "v1的有效长度为:" << v1.size() << endl;
//	cout << "v1的容量大小为:" << v1.capacity() << endl;
//	v1.resize(8, 10);
//	for (auto& e : v1)
//	{
//		cout << e << " ";
//	}
//}
//// error
////因为reserve只是改变了容量capacity并没有改变size,
////而operator[]访问时元素时是禁止访问下标size以后的元素的,一旦访问就会直接报错
//void Test5()
//{
//	vector<int> v;
//	v.reserve(10);
//	for (int i = 0; i < 10; i++)
//	{
//		v[i] = i;
//	}
//	for (auto& e : v)
//	{
//		cout << e << " ";
//	}
//}
//void Test6()
//{
//	vector<int> v = { 1,2,3,4,5 };
//	for (int i = 0; i < v.size(); i++)
//	{
//		cout << v[i] << " ";
//	}
//	cout << endl;
//	cout << "front:" << v.front() << endl;
//	cout << "back:" << v.back() << endl;
//}
//void Test7()
//{
//	vector<int> v = { 1,2,3,4,5,6 };
//	cout << "back:" << v.back() << endl;
//	//尾插
//	v.push_back(7);
//	//尾删
//	cout << "back:" << v.back() << endl;
//	v.pop_back();
//	cout << "back:" << v.back() << endl;
//	vector<int> vv = { 6,5,4,3,2,1 };
//	//n个val赋值给原数组
//	vv.assign(3, 2);
//	for (int i = 0; i < vv.size(); i++)
//	{
//		cout << vv[i] << " ";
//	}
//	cout << endl;
//	vv.swap(v);
//	for (int i = 0; i < v.size(); i++)
//	{
//		cout << v[i] << " ";
//	}
//	cout << endl;
//	for (int i = 0; i < vv.size(); i++)
//	{
//		cout << vv[i] << " ";
//	}
//}
//void Test8()
//{
//	vector<int> myvector(3, 100);
//	vector<int>::iterator it = myvector.begin();
//	//1.向指定位置插入一个元素
//	it = myvector.insert(it, 200);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//	//2.向指定位置插入n个元素
//	myvector.insert(it, 2, 300);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//	//3.向指定位置插入一段迭代器区间
//	it = myvector.begin();
//	vector<int> anothervector(2, 400);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//	it = myvector.begin();
//	myvector.insert(it + 2, anothervector.begin(), anothervector.end());
//	//4.向指定位置插入一段迭代器区间
//	int myarray[] = { 501,502,503 };
//	myvector.insert(myvector.begin(), myarray, myarray + 3);
//	cout << "myvector contains:";
//	for (it = myvector.begin(); it < myvector.end(); it++)
//		cout << ' ' << *it;
//	cout << endl;
//}
//void Test9()
//{
//	//1.删除迭代器所指元素
//	vector<int> myvector;
//	for (int i = 1; i <= 10; i++)
//		myvector.push_back(i);
//	vector<int>::iterator it = myvector.erase(myvector.begin() + 5);
//	it = myvector.erase(it);
//	//2.删除一段迭代器区间
//	it = myvector.erase(myvector.begin(), myvector.begin() + 3);
//	cout << "myvector contains:";
//	for (int i = 0; i < myvector.size(); ++i)
//		cout << ' ' << myvector[i];
//	cout << endl;
//}
////int main()
////{
////	//Test3();
////	//TestExpand();
////	//Test4();
////	//Test5();
////	//Test6();
////	//Test7();
////	//Test8();
////	Test9();
////}
//
//int main()
//{
//	vector<int> v{ 1,2,3,4,5,6 };
//	auto it = v.begin();
//	v.assign(100, 8);
//	while (it != v.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//	return 0;
//}

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

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

相关文章

腾讯云代码助手使用指南

腾讯云代码助手使用指南什么是腾讯云代码助手功能区展示功能介绍功能演示一、创建新项目1.先用Chat 把口语化的需求转换成AI更容易接受的结构化提示词2.再用Craft 模式进行代码生成3.成果展示二、老项目探索1.使用Codebase 帮理解项目代码三、代码补全1.只需输入标准的函数名&a…

【vue3+vue-pdf-embed】实现PDF+图片预览

【vue3vue-pdf-embed】实现PDF图片预览项目背景项目代码分析代码项目背景 技术栈&#xff1a;vue3Tselementplus 需要实现PDF和图片预览 图片预览很好解决了&#xff0c;可以用elementplus 自带的组件el-image 可实现 PDF预览可以用搜了一圈&#xff0c;有两个方案&#xff0c…

Leetcode力扣解题记录--第21题(合并链表)

题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&…

基于单片机的楼宇门禁系统的设计与实现

2、系统总体设计 2.1硬件的总体设计 为了使门禁系统智能化&#xff0c;需要一个主控芯片对整个门禁系统进行管理控制。接着还需要对应的模块完成包括数字密码验证和IC卡识别验证的功能。当出现非法闯入、验证失败等情况时还需要对操作人员进行警告。最后需要一个人机交互界面方…

全天候自动化数字型智能驱鸟装置,电网防鸟高科技

鸟类在输电线路铁塔、电线杆上筑巢、栖息和排泄是个大问题&#xff0c;很容易引发线路故障导致停电。为了保障电网安全稳定运行&#xff0c;会用到各种智能驱鸟装置来驱赶鸟类&#xff0c;避免涉鸟故障发生。例如全天候自动化数字型智能驱鸟装置&#xff0c;其厉害的地方在于它…

技术、生态与商业:从PC到移动的平台之争

在科技发展的漫长历史中&#xff0c;我们常常惊叹于那些改变世界的伟大技术。然而&#xff0c;深入探究会发现&#xff0c;单纯的技术领先并不能保证最终的胜利。从 PC 操作系统到移动终端&#xff0c;乃至服务器软件&#xff0c;那些最终笑傲江湖的巨头们都遵循着一个共同的法…

android JXL 导出Excel(.xls/xlsx)

前面使用过 POI 导出xlsx但是它体量比较大&#xff0c;功能较丰富&#xff0c;在一些对包size比较敏感并且导出需求相对简单的项目中就不太适合。 poi链接&#xff1a;Android 导入导出excel xls、xlsx_android excel导入导出-CSDN博客 jxl 包体积小&#xff0c;使用简单、AP…

mysql 的主从机制是怎么实现的?

MySQL 作为当前最流行的开源关系型数据库之一&#xff0c;为了满足数据的高可用、负载均衡和容灾备份等需求&#xff0c;广泛应用主从复制&#xff08;Replication&#xff09;机制。其核心思想是&#xff1a;在一台主库&#xff08;Master&#xff09;上发生的所有数据变更都会…

【PHP 函数从入门到精通】

&#x1f9e0; PHP 函数从入门到精通 PHP 函数是编程中最基础、也是最强大的工具之一。它不仅可以简化代码、提高复用性&#xff0c;还能通过各种高级用法&#xff0c;让你写出更灵活、更现代的代码。 下面我们从函数的基础讲起&#xff0c;逐步深入&#xff0c;带你掌握函数的…

CGA老年综合评估汉密尔顿抑郁量表与认知评估联用

一、CGA老年综合评估汉密尔顿抑郁量表与认知评估联用的基础CGA老年综合评估 &#xff08;一&#xff09;二者评估内容的互补性 CGA老年综合评估汉密尔顿抑郁量表主要聚焦于老年人的抑郁情绪及相关症状&#xff0c;而认知评估则着重考察老年人的记忆力、注意力、思维能力等认知…

教培机构如何开发自己的证件照拍照采集小程序

职业教培机构对学员的证件照采集是进行学生培训管理、考试报名、证书发放的前置工作&#xff0c;传统拍照和收集证件照的方式往往面临效率低、质量参差不齐等问题。开发一款专属的证件照拍照采集小程序&#xff0c;不仅能提升机构形象&#xff0c;还能大幅优化工作流程。借助“…

GC8872刷式直流电机驱动器详解:3.6A驱动能力与PWM控制

概述GC8872是一款具有故障报告功能的刷式直流电机驱动芯片&#xff0c;专为打印机、电器、工业设备等机电一体化应用设计。这款芯片采用ESOP8封装&#xff0c;集成了H桥驱动电路和多种保护功能&#xff0c;支持高达3.6A的峰值电流输出。关键特性宽电压工作范围&#xff1a;6.5V…

从0开始学习R语言--Day54--双重固定模型

对于具有空间差异的数据&#xff0c;如果不知道数据的特征关系或意义&#xff0c;直接用杜宾模型来处理是一个比较通用的思路&#xff0c;只是后续还需要很多检验去证明结果的可解释性和统计性。但如果我们已经知道特征的意义&#xff0c;比如企业经济发展的数据中有着员工的科…

三生筛法在计算数论中的极限是什么?

AI辅助创作&#xff1a;三生筛法在计算数论中的极限主要体现在‌规模边界‌、‌算法适应性‌及‌理论兼容性‌三个维度&#xff0c;其核心瓶颈与突破路径如下&#xff1a;一、规模边界&#xff1a;计算效率的断崖式衰减‌‌低维高效区的上限‌在 10^15 以内数域&#xff0c;三生…

iOS WebView 加载失败与缓存刷新问题排查实战指南

在移动 App 中嵌入网页后&#xff0c;不少团队都会遇到一个诡异的问题&#xff1a;用户看到的是“旧内容”&#xff0c;或“资源加载失败”&#xff0c;但在浏览器调试中一切正常。特别是在 iOS WebView 中&#xff0c;这类缓存和加载问题常常隐匿、难以复现。 这篇文章将通过一…

GoLand 项目从 0 到 1:第二天 —— 数据库自动化

第二天核心任务&#xff1a;自动化与多数据库支持第二天的开发聚焦于数据库自动化流程构建与MongoDB 业务链路扩展&#xff0c;通过工具化手段解决数据库操作的重复性问题&#xff0c;同时完善多数据库支持能力。经过一天的开发&#xff0c;项目已实现数据库初始化、迁移、种子…

qt框架,使用webEngine如何调试前端

解决 Qt 5.14.2 中启用开发者工具的问题问题在于 Qt 5.14.2 中 QWebEngineSettings::DeveloperExtrasEnabled 属性已被弃用或更改。正确启用开发者工具的完整方法&#xff08;Qt 5.14.2&#xff09;1. 修改 main.cpp#include <QWebEngineView> #include <QWebEngineSe…

【Atlassian生态】Jira Cloud单站点现可支持10万用户:架构升级与龙智云迁移服务

作为Atlassian全球白金合作伙伴&#xff0c;龙智团队非常激动地宣布&#xff1a;Jira迎来历史性突破——Jira Cloud单个站点最高可支持10万用户&#xff01;覆盖Enterprise、Premium和Standard版本。现在&#xff0c;更多的团队可以将Jira作为核心协作中枢&#xff0c;以加速目…

深入解析JVM垃圾回收调优:性能优化实践指南

深入解析JVM垃圾回收调优&#xff1a;性能优化实践指南 一、技术背景与应用场景 随着互联网业务的飞速发展&#xff0c;Java 应用在高并发、大内存场景下对 JVM 性能提出了更高要求。垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;作为 JVM 的核心组件之一…

万字解析Redission ---深入理解Redission上锁过程

Redisson获取锁过程 RLock lock redissonClient.getLock("lock:order" userId); boolean isLock lock.tryLock(1L, TimeUnit.SECONDS);调用tyrLock其实就是下面的方法&#xff0c;如果说没有指定锁的过期时间&#xff0c;可以看到这边设置为了-1Overridepublic bo…