C++string类
1.为什么学习string类?
1.1C语言中的字符串
C语言中,字符串是以‘\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问
1.2面试题
字符串相加
在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单,方便,快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数
2.标准库中的string类
2.1string类(了解)
string类的文档介绍
- 1.字符串是表示字符序列的类
2.标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作字节字符字符串的设计特性
3.string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型()关于模板的更多信息,请参阅basic_string)
4.string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)
5.注意,这个类独立所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度和大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作
总结:
- 1.string是表示字符串的字符串类
2.该类的接口与常规容器的接口基本相同,在添加了一些专门用来操作string的常规操作
3.string在底层实际是:basic_string模板类的别名,tyoedef basic_string<char,char_traits,allocator>string
4.不能操作多字节或者变长字符的序列
在使用string类时,必须包含#include头文件以及using namespace std;
2.2string类的常用接口说明(下面是一些常用接口)
1.string类对象的常见构造
void Teststring()
{string s1; // 构造空的string类对象s1string s2("hello bit"); // 用C格式字符串构造string类对象s2string s3(s2); // 拷贝构造s3
}
2.string类对象的容量操作
注:
- 1.size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()
2.clear()只是将string中有效字符清空,不改变底层空间大小
3.resize(size_t n)与resize(size_t n,char c)都是将字符串中有效字符改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n,char c)用字符C来填充多出的元素空间,注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变
4.reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserve不会改变容量大小
3.string类对象的访问即遍历操作
4.string类对象的修改操作
注:
- 1.在string尾部追加字符时,s.push_back(c)/s.append(1,c)/s+=‘c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串
2.对string操作时,如果能够大概预估到放多少个字符,可以先通过reserve把空间预留好
5.string类非成员函数
6.vs和g++下string结构的说明
注意:下书结构是在32位平台下进行验证,32位平台下指针占4个字节
- VS下string的结构
- string总共占28个字节,内部结构稍微复杂一点,先是有一个联合体,联合体用来定义string中字符串的存储空间
- 当字符串长度小于16时,使用内部固定的字符数组来存放
- 当字符串长度大于等于16时,从堆上开辟空间
union _Bxty
{ // storage for small buffer or pointer to larger onevalue_type _Buf[_BUF_SIZE];pointer _Ptr;char _Alias[_BUF_SIZE]; // to permit aliasing
} _Bx;
这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高
其次:还有一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量
最后:还有一个指针做一些其他事情
故总共占16+4+4+4=28个字节
- g++下string的结构
G++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段 - 空间总大小
- 字符串有效长度
- 引用计数
struct _Rep_base
{size_type _M_length;size_type _M_capacity;_Atomic_word _M_refcount;
};
- 指向堆空间的指针,用来存储字符串
7.牛刀小试
仅仅反转字母
class Solution {
public:bool isLetter(char ch){if(ch >= 'a' && ch <= 'z')return true;if(ch >= 'A' && ch <= 'Z')return true;return false;}string reverseOnlyLetters(string S) {if(S.empty())return S;size_t begin = 0, end = S.size()-1;while(begin < end){while(begin < end && !isLetter(S[begin]))++begin;while(begin < end && !isLetter(S[end]))--end;swap(S[begin], S[end]);++begin;--end;}return S;}};
找字符串中第一个只出现一次的字符
class Solution {
public:int firstUniqChar(string s) {// 统计每个字符出现的次数int count[256] = {0};int size = s.size();for(int i = 0; i < size; ++i)count[s[i]] += 1;// 按照字符次序从前往后找只出现一次的字符for(int i = 0; i < size; ++i)if(1 == count[s[i]])return i;return -1;}
};
字符串里面最后一个单词的长度–课堂练习
#include<iostream>
#include<string>
using namespace std;
int main()
{string line;// 不要使用cin>>line,因为会它遇到空格就结束了// while(cin>>line)while(getline(cin, line)){size_t pos = line.rfind(' ');cout<<line.size()-pos-1<<endl;}return 0;
}
验证一个字符串是否是回文
class Solution {
public:bool isLetterOrNumber(char ch)
{return (ch >= '0' && ch <= '9')|| (ch >= 'a' && ch <= 'z')|| (ch >= 'A' && ch <= 'Z');}bool isPalindrome(string s) {// 先小写字母转换成大写,再进行判断for(auto& ch : s){if(ch >= 'a' && ch <= 'z')ch -= 32;}int begin = 0, end = s.size()-1;while(begin < end){while(begin < end && !isLetterOrNumber(s[begin]))++begin;while(begin < end && !isLetterOrNumber(s[end]))--end;if(s[begin] != s[end]){return false;}else{++begin;--end;}[添加链接描述](https://leetcode.cn/problems/add-strings/)}return true;}
};
字符串相加
class Solution {
public:string addstrings(string num1, string num2)
{// 从后往前相加,相加的结果到字符串可以使用insert头插// 或者+=尾插以后再reverse过来int end1 = num1.size()-1;int end2 = num2.size()-1;int value1 = 0, value2 = 0, next = 0;string addret;while(end1 >= 0 || end2 >= 0){if(end1 >= 0)value1 = num1[end1--]-'0';elsevalue1 = 0;if(end2 >= 0)value2 = num2[end2--]-'0';elsevalue2 = 0;int valueret = value1 + value2 + next;if(valueret > 9){next = 1;valueret -= 10;}else{next = 0;}//addret.insert(addret.begin(), valueret+'0');addret += (valueret+'0');}if(next == 1){//addret.insert(addret.begin(), '1');addret += '1';}reverse(addret.begin(), addret.end());return addret;}
};
翻转字符串II:区间部分翻转
翻转字符串III:翻转字符串中的单词
字符串相乘述
找出字符串中第一个只出现一次的字符
3.string类的模拟实现
3.1经典的string 类问题
下面的string类实现是否有问题
// 为了和标准库区分,此处使用String
class String
{
public:
/*String():_str(new char[1]){*_str = '\0';}*///String(const char* str = "\0") 错误示范//String(const char* str = nullptr) 错误示范String(const char* str = ""){// 构造String类对象时,如果传递nullptr指针,可以认为程序非if (nullptr == str){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);}~String(){if (_str){delete[] _str;_str = nullptr;}}
private:char* _str;
};
// 测试
void TestString()
{String s1("hello bit!!!");String s2(s1);
}
说明:上述**string类没有显示定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认的,当用s1构造s2时,编译器会调用默认的拷贝构造,最终导致的问题是,s1, s2共用同一块内存空间,,在释放时同一块空间被释放多次而引起程序崩溃,**这种拷贝方式,称为浅拷贝
3.2浅拷贝
浅拷贝:也称为位拷贝,编译器只是将对象中的值拷贝过来,如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进行操作时,就会发生访问违规
就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就
你争我夺,玩具损坏。
可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。父母给每个孩
子都买一份玩具,各自玩各自的就不会有问题了
可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享,父母给每个孩子都买一份玩具,各自玩各自的就不会有问题了
3.3深拷贝
如果一个类中涉及到资源的管理,其拷贝构造函数,赋值重载以及析构函数必须要显示给出,一般情况都是按照深拷贝方式提供
3.3.1传统版写法的string类
class String
{
public:String(const char* str = ""){// 构造String类对象时,如果传递nullptr指针,可以认为程序非if (nullptr == str){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);}String(const String& s): _str(new char[strlen(s._str) + 1]){strcpy(_str, s._str);}String& operator=(const String& s){if (this != &s){char* pStr = new char[strlen(s._str) + 1];strcpy(pStr, s._str);delete[] _str;_str = pStr;}return *this;}~String(){if (_str){delete[] _str;_str = nullptr;}}
private:char* _str;
};
3 3.2现代版写法的string类
class String
{
public:String(const char* str = ""){if (nullptr == str){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);}String(const String& s): _str(nullptr){String strTmp(s._str);swap(_str, strTmp._str);}// 对比下和上面的赋值那个实现比较好?String& operator=(String s){swap(_str, s._str);return *this;}/*String& operator=(const String& s){if(this != &s){String strTmp(s);swap(_str, strTmp._str);}return *this;}*/~String(){if (_str){delete[] _str;_str = nullptr;}}
private:char* _str;
};
3.3写时拷贝(了解)
写时拷贝就是一种拖延症,是在浅拷贝的基础之上增加了引用计数的方式来实现的
引用计数:用来记录资源使用者的个数,在构造时,将资源的计数给成1,每增加一个对象使用资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放,否则就不能释放,因为还有其他对象在使用该资源
写时拷贝
写时拷贝在读取是的缺陷
3.4string类的模拟实现
#define _CRT_SECURE_NO_WARNINGS#include <iostream>
using namespace std;
#include <assert.h>namespace bit
{class string{public:typedef char* iterator;public:string(const char* str = ""){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);}string(const string& s): _str(nullptr), _size(0), _capacity(0){string tmp(s._str);this->swap(tmp);}string& operator=(string s){this->swap(s);return *this;}~string(){if (_str){delete[] _str;_str = nullptr;}}/// iteratoriterator begin() { return _str; }iterator end() { return _str + _size; }/// modifyvoid push_back(char c){if (_size == _capacity)reserve(_capacity * 2);_str[_size++] = c;_str[_size] = '\0';}string& operator+=(char c){push_back(c);return *this;}// 作业实现void append(const char* str);string& operator+=(const char* str);void clear(){_size = 0;_str[_size] = '\0';}void swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}const char* c_str()const{return _str;}/// capacitysize_t size()const{return _size;}size_t capacity()const{return _capacity;}bool empty()const{return 0 == _size;}void resize(size_t newSize, char c = '\0'){if (newSize > _size){// 如果newSize大于底层空间大小,则需要重新开辟空间if (newSize > _capacity){reserve(newSize);}memset(_str + _size, c, newSize - _size);}_size = newSize;_str[newSize] = '\0';}void reserve(size_t newCapacity){// 如果新容量大于旧容量,则开辟空间if (newCapacity > _capacity){char* str = new char[newCapacity + 1];strcpy(str, _str);// 释放原来旧空间,然后使用新空间delete[] _str;_str = str;_capacity = newCapacity;}}// accesschar& operator[](size_t index){assert(index < _size);return _str[index];}const char& operator[](size_t index)const{assert(index < _size);return _str[index];}// 作业bool operator<(const string& s);bool operator<=(const string& s);bool operator>(const string& s);bool operator>=(const string& s);bool operator==(const string& s);bool operator!=(const string& s);// 返回c在string中第一次出现的位置size_t find(char c, size_t pos = 0) const;// 返回子串s在string中第一次出现的位置size_t find(const char* s, size_t pos = 0) const;// 在pos位置上插入字符c/字符串str,并返回该字符的位置string& insert(size_t pos, char c);string& insert(size_t pos, const char* str);// 删除pos位置上的元素,并返回该元素的下一个位置string& erase(size_t pos, size_t len);private:friend ostream& operator<<(ostream& _cout, const bit::string& s);friend istream& operator>>(istream& _cin, bit::string& s);private:char* _str;size_t _capacity;size_t _size;};ostream& operator<<(ostream& _cout, const bit::string& s){// 不能使用这个, 因为string的字符串内部可能会包含\0// 直接cout时, 是将_str当成char*打印的,遇到内部的\0时后序内容就不打印了//cout << s._str;for (size_t i = 0; i < s.size(); ++i){_cout << s[i];}return _cout;}
}///对自定义的string类进行测试
void TestBitstring()
{bit::string s1("hello");s1.push_back(' ');s1.push_back('b');s1.push_back('i');s1 += 't';cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;// 利用迭代器打印string中的元素bit::string::iterator it = s1.begin();while (it != s1.end()){cout << *it;++it;}cout << endl;// 这里可以看到一个类只要支持的基本的iterator,就支持范围forfor (auto ch : s1)cout << ch;cout << endl;
}
4.拓展阅读
面试中string的一种正确写法述
STL中的string类怎么了?
相关文章:
C++string类
1.为什么学习string类? 1.1C语言中的字符串 C语言中,字符串是以‘\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OO…...
下载linux aarch64版本的htop
htop代码网站似乎没有编译好的各平台的包,而自己编译需要下载一些工具,比较麻烦。这里找到了快速下载和使用的方法,记录一下。 先在linux电脑上执行: mkdir htop_exe cd htop_exe apt download htop:arm64 # 会直接下载到当前目…...
MYSQL---------支持数据类型
数值类型 整数类型 TINYINT:通常用于存储小范围的整数,范围是-128到127或0到255(无符号)。例如,存储年龄可以使用TINYINT类型。示例:CREATE TABLE users (age TINYINT);SMALLINT:范围比TINYINT…...
黑马JavaWeb开发跟学(十四).SpringBootWeb原理
黑马JavaWeb开发跟学 十四.SpringBootWeb原理 SpingBoot原理1. 配置优先级2. Bean管理2.1 获取Bean2.2 Bean作用域2.3 第三方Bean 3. SpringBoot原理3.1 起步依赖3.2 自动配置3.2.1 概述3.2.2 常见方案3.2.2.1 概述3.2.2.2 方案一3.2.2.3 方案二 3.2.3 原理分析3.2.3.1 源码跟踪…...
迅为RK3568开发板编译Android12源码包-设置屏幕配置
在源码编译之前首先要确定自己想要使用的屏幕并修改源码,在编译镜像,烧写镜像。如下图所示: 第一步:确定要使用的屏幕种类,屏幕种类选择如下所示: iTOP-3568 开发板支持以下种类屏幕: 迅为 LV…...
Spring Boot 中 TypeExcludeFilter 的作用及使用示例
在Spring Boot应用程序中,TypeExcludeFilter 是一个用于过滤特定类型的组件,使之不被Spring容器自动扫描和注册为bean的工具。这在你想要排除某些类或类型(如配置类、组件等)而不希望它们参与Spring的自动装配时非常有用。 作用 …...
Prometheus 采集 JVM 数据
Prometheus 采集 JVM 数据通常通过集成 JMX Exporter(Java Management Extensions Exporter)实现。以下是完整的介绍和操作步骤: 1. 原理概述 JVM 数据采集依赖于 JMX(Java Management Extensions),JVM 提…...
OpenNJet v3.2.0正式发布!
在这个版本中,NJet实现重大突破,提供了动态Upstream的能力。这是一个关键的特性,使得NJet可以按需动态管理上游服务器池,从而使得业务方可以按需配置资源池,实现业务分区、算法切换;结合动态路由技术&#…...
TinaCMS: 革命性的开源内容管理框架
在如今的数字时代,高效的内容管理系统(CMS)已成为构建内容丰富网站和应用程序的必需品。传统 CMS,如 WordPress 和 Drupal,功能丰富但复杂度高。而新一代 CMS,例如 TinaCMS,以其灵活性和开发者友…...
VuePress2配置unocss的闭坑指南
文章目录 1. 安装依赖:准备魔法材料2. 检查依赖版本一定要一致:确保魔法配方准确无误3. 新建uno.config.js:编写咒语书4. 配置config.js和client.js:完成仪式 1. 安装依赖:准备魔法材料 在开始我们的前端魔法之前&…...
SpringCloud(二)--SpringCloud服务注册与发现
一. 引言 前文简单介绍了SpringCloud的基本简介与特征,接下来介绍每个组成部分的功能以及经常使用的中间件。本文仅为学习所用,联系侵删。 二. SpringCloud概述 2.1 定义 Spring Cloud是一系列框架的有序集合,它巧妙地利用了Spring…...
JavaVue-Get请求 数组参数(qs格式化前端数据)
前言 现在管理系统,像若依,表格查询一般会用Get请求,把页面的查询条件传递给后台。其中大部分页面会有日期时间范围查询这时候,为了解决请求参数中的数组文件,前台就会在请求前拦截参数中的日期数组数据,然…...
Java-多种方法实现多线程卖票
Java多线程卖票是一个经典的并发编程问题,它展示了如何在多个线程之间安全地共享和修改资 源。以下是几种实现方式: 使用synchronized关键字: 使用synchronized修饰符来同步方法或代码块,确保同一时刻只有一个线程可以访问临界区(即操 作共享资源的代码)。 使用Reen…...
LLVM防忘录
目录 Windows中源码编译LLVMWindows下编译LLVM Pass DLL Windows中源码编译LLVM 直接从llvm-project下载源码, 然后解压后用VS2022打开该目录, 然后利用VS的开发终端执行: cmake -S llvm -B build -G "Visual Studio 17 2022" -DLLVM_ENABLE_PROJECTSclang -DLLVM_…...
Elasticsearch:基础概念
一、什么是Elasticsearch Elasticsearch是基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展数据存储和矢量数据库。它针对生产规模工作负载的速度和相关性进行了优化。使用 Elasticsearch 可以近乎实时地搜索、索引、存储和分析各种形状和大小的数据。Elasticsearch 是…...
【快速实践】类激活图(CAM,class activation map)可视化
类激活图可视化:有助于了解一张图像的哪一部分让卷积神经网络做出了最终的分类决策 对输入图像生成类激活热力图类激活热力图是与特定输出类别相关的二维分数网格:对任何输入图像的每个位置都要进行计算,它表示每个位置对该类别的重要程度 我…...
从零开始自搭SpringBoot项目 -- Qingluopay项目工程介绍
从零开始自搭项目 – QingLuoPay 一,为什么要从零开始自搭项目 首先在介绍这个项目之前先介绍一下我为什么要选择从零自搭项目,而不是跟着网上哪些视频等做项目。 之前的很长一段时间我也都是在网上找一些做项目的视频就包含黑马的(神领物…...
使用 Jupyter Notebook:安装与应用指南
文章目录 安装 Jupyter Notebook1. 准备环境2. 安装 Jupyter Notebook3. 启动 Jupyter Notebook4. 选择安装方式(可选) 二、Jupyter Notebook 的基本功能1. 单元格的类型与运行2. 可视化支持3. 内置魔法命令 三、Jupyter Notebook 的实际应用场景1. 数据…...
.NET框架用C#实现PDF转HTML
HTML作为一种开放标准的网页标记语言,具有跨平台、易于浏览和搜索引擎友好的特性,使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式,我们可以更方便地在浏览器中展示PDF文档内容,同时也更容…...
使用 httputils + chronicle-bytes 实现金融级 java rpc
1、认识 chronicle-bytes Chronicle-Bytes 是一个类似于 Java NIO 的 ByteBuffer 的高效字节操作库,但它提供了许多扩展功能。这个项目由 OpenHFT 开发并维护,旨在提供高性能、低延迟的数据处理解决方案。Chronicle-Bytes 设计用于高频率交易和其他对性…...
开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现推理加速的正确姿势-利用KOR框架实现结构化输出(七)
一、前言 目前,大语言模型已升级至Qwen2.5版本。无论是语言模型还是多模态模型,均在大规模多语言和多模态数据上进行预训练,并通过高质量数据进行后期微调以贴近人类偏好。在本篇学习中,将集成vllm实现模型推理加速,现在,我们赶紧跟上技术发展的脚步,去体验一下新版本模…...
利用大语言模型解决推理任务
利用大语言模型(Large Language Models, LLMs)来解决推理任务是目前人工智能领域中的一个重要研究方向。大语言模型,如GPT系列(包括ChatGPT)和BERT等,具有强大的自然语言理解和生成能力,已经能够…...
修复OpenLinkSaas客户端在使用AtomGit账号时页面崩溃
问题描述:当一个新的AtomGit用户登录OpenLinkSaas客户端后出现了页面崩溃。 从浏览器控制台来看,是gitNoticeList出现了null。 查看代码后发现是请求atomGit api是返回的一个null的列表 接下来我们加下保护性的代码,来兼容null或undefine的情…...
如何使用大语言模型进行事件抽取与关系抽取
诸神缄默不语-个人CSDN博文目录 文章目录 1. 什么是事件抽取与关系抽取?2. 示例:使用大语言模型进行事件抽取与关系抽取 1. 什么是事件抽取与关系抽取? 事件抽取是指从文本中识别出与某些“事件”相关的信息。这些事件通常包括动作、参与者、…...
WebRTC线程的启动与运行
WebRTC线程运行的基本逻辑: while(true) {…Get(&msg, …);…Dispatch(&msg);… }Dispatch(Message *pmsg) {…pmsg->handler->OnMessage(pmsg);… }在执行函数内部,就是一个while死循环,只做两件事,从队列里Get取…...
Unity3D ILRuntime开发原则与接口绑定详解
引言 ILRuntime是一款基于C#的热更新框架,使用IL2CPP技术将C#代码转换成C代码,支持动态编译和执行代码,适用于Unity3D的所有平台,包括Android、iOS、Windows、Mac等。本文将详细介绍ILRuntime在Unity3D中的开发原则及接口绑定技术…...
grouped = df.drop(‘name‘, axis=1).groupby(‘team‘)
这行代码: grouped df.drop(name, axis1).groupby(team)的作用是首先删除 DataFrame 中的 name 列,然后按 team 列进行分组。以下是对每个部分的详细解释: 1. df.drop(name, axis1) df.drop(name, axis1) 这部分代码会从 DataFrame df 中…...
mysqll连接用时太长解决方法
1、连接用时太长分析 从客户端连接mysql服务器,时间长达10几秒,此为mysql的dns的反向解析造成,在局域网内如果都是用ip连接,可以通过在配置文件中添加skip-name-resolve,取消此功能,取消后,就不…...
Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询
作者:来自 Elastic Valentin Crettaz 了解 AutoOps 如何帮助你调查困扰集群的长期搜索查询以提高搜索性能。 AutoOps 于 11 月初在 Elastic Cloud Hosted 上发布,它通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 Au…...
SpringCloud源码-Ribbon
一、Spring定制化RestTemplate,预留出RestTemplate定制化扩展点 org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration 二、Ribbon定义RestTemplate Ribbon扩展点功能 org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguratio…...
使用Python,pypinyin将汉字转为带音调,首字母等多种风格的拼音,自动学习生字词
使用Python,pypinyin将汉字转为带音调,首字母等多种风格的拼音,自动学习生字词 1. 效果图2. 安装及支持的音调分类3. 源码参考 这篇博客将介绍如何使用Python,pypinyin将汉字转为带音调的拼音,自动学习生字词ÿ…...
消防设施操作员考试题库及答案
一、单选题 1.根据国家标准《防火门》(CB1295~2008)的规定,门扇上带防火玻璃的防火门的代号为()。 A.s B.bl C.b D.l 答案:C 解析:根据初级教材238页,门扇上带防火玻璃的防火门的代号为b。 2.关于彩…...
算法:IMPACT通过微生物特征分析可解释的微生物表型
文章目录 介绍框架代码参考 介绍 人类肠道微生物群由数万亿细菌组成,对健康和疾病有重大影响。通过现代技术的进步,高通量分析提供了增强我们对微生物组与复杂疾病结果之间联系的理解的潜力。然而,目前的微生物组模型缺乏微生物特征的可解释…...
2、zookeeper和kafka
zookeeper zookeeper基本知识 zookeeper:开源的分布式框架协调服务 zookeeper的工作机制 基于观察者模式设计的分布式结构,复制存储和管理架构当中的元信息,架构当中的应用接受观察者的监控,一旦数据有变化,通知对于…...
监控工具(Nagios)
2.4 Nagios 2.4.1 基础概念讲解 嘿,小伙伴们!我们已经见识过了Prometheus、Grafana和Zabbix的强大功能,现在是时候认识一下监控界的“老大哥”——Nagios了!Nagios是一款历史悠久的开源监控工具,虽然它可能没有像Zab…...
c++不够用知识补充-using namespace
感觉c的知识储备不够用了,忘记的再捡起来?! C之using namaspace;(未完)_namspace include-CSDN博客文章浏览阅读238次。初学C时,只要是程序都是用这个来打头。#includeusing namespace std;以前也不求甚解,知道随着对…...
奇异值分解SVD
线性变换 SVD在2*2矩阵 SVD推广到任意大小矩阵 去掉奇异值小的部分: 原始的时空矩阵模式1模式2模式3...
如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]
无论您是在上在线课程还是参加在线会议,您都可能需要在 Windows 10/11 上录制带有音频的屏幕。互联网上提供了多种可选方法。在这里,本博客收集了 3 种最简单的方法来指导您如何在 Windows 10/11 上使用音频进行屏幕录制。请继续阅读以探索! …...
Linux centos7 docker安装 (yum快速安装)
Linux centos7 docker安装 (yum快速安装) 1. 查看内核1.1 内核升级操作(可选) 2. 部署docker2.1 卸载旧版本2.2 安装需要的软件包2.3 添加阿里云镜像源2.4 部署docker(可手动选择版本,默认安装最新版本&…...
深入Android架构(从线程到AIDL)_08 认识Android的主线程
目录 3、 认识Android的主线程(又称UI线程) 复习: 各进程(Process)里的主线程编辑 UI线程的责任: 迅速处理UI事件 举例 3、 认识Android的主线程(又称UI线程) 复习: 各进程(Process)里的主线程 UI线程的责任: 迅速处理UI事…...
接受Header使用错Map类型,导致获取到的Header值不全
问题复现 在 Spring 中解析 Header 时,我们在多数场合中是直接按需解析的。例如,我们想使用一个名为 myHeaderName 的 Header,我们会书写代码如下:RequestMapping(path "/hi", method RequestMethod.GET) public Str…...
等保测评和密评的相关性和区别
等保测评和密评在网络安全领域均扮演着至关重要的角色,它们之间既存在相关性,又各具特色。 以下是对两者相关性和区别的详细阐述:相关性 1.法律基础:等保测评和密评都是依据国家相关法律法规开展的活动。 等保测评主要依据《网…...
朱姆沃尔特隐身战舰:从失败到威慑
前言 "朱姆沃尔特"号驱逐舰是美国海军雄心勃勃的项目,旨在重塑未来海战。它融合了隐身、自动化和强大火力,然而由于技术问题和预算超支,原计划建造32艘的目标被大幅缩减,最终只建造了三艘。该舰的设计特点包括“穿浪逆船…...
create-a-weather-app-using-flask-python
使用 Flask | Python 创建天气应用程序 原文:https://www . geesforgeks . org/create-a-weather-app-use-flask-python/ 先决条件: 烧瓶安装 Flask 是一个用 Python 编写的轻量级框架。它是轻量级的,因为它不需要特定的工具或库,并且允许快速的 web 开…...
BurpSuite2024.11
新增功能 2024 年 11 月 25 日,版本 24.11 此版本引入了站点地图过滤器 Bambdas、匹配和替换 Bambdas、用于 API 扫描的动态身份验证令牌,以及用于入侵者攻击的增强负载管理。我们还进行了多项用户体验改进、性能改进和一些错误修复。 使用 Bambdas 过…...
MyBatis-plus sql拦截器
因为业务需求,重新写了一套数据权限。项目中用的是mybtis-plus,正好MyBatis-Plus提供了插件数据权限插件 | MyBatis-Plus,那就根据文档来实现这个需求。 实现: 实现MultiDataPermissionHandler 首先创建MultiDataPermissionHan…...
springboot3 redis 批量删除特定的 key 或带有特定前缀的 key
在 Spring Boot 3 中与 Redis 一起使用时,可以通过 Redis 的命令来实现批量删除特定的 Key 或带有特定前缀的 Key。以下是实现方式和注意事项。 使用 RedisTemplate RedisTemplate 是 Spring Boot 提供的一个操作 Redis 的工具,支持各种 Redis 操作。 …...
若依框架(前后端分离)集成cas5.5
一、后端配置 1、添加cas依赖 在common模块pom添加spring-security-cas依赖: <!-- spring security cas--> <dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-cas</artifactId> &l…...
区块链方向学习路线
学习路线图 下面是登链社区给出的区块链开发者的学习路线图 学习路线建议 对于一个区块链方向的学习者而言,首先要了解的是区块链理论知识,当你了解了区块链的理论知识之后,下面有三个方向来学习,可以通俗的理解为区块链方向的后…...
【从零开始入门unity游戏开发之——C#篇40】C#特性(Attributes)和自定义特性
文章目录 前言一、特性(Attributes)基本概念二、自定义特性1、自定义特性代码示例:2、应用自定义特性:3、解释3.1 **AttributeUsage 特性**3.2 特性的命名3.3 **构造函数**:3.4 **属性**: 4、使用反射获取特…...