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

OC foudation框架(上)学习

foundation框架

文章目录

  • foundation框架
    • 字符串(NSString && NSMutableString)
      • NSString的其他功能
      • NSMutableString
    • 日期与时间 (NSDate)
      • 2.1 日期与时间(NSDate)
      • 2.2日期格式器
      • 日历与日期组件
      • 定时器(NSTimer)
    • 对象复制
      • copy与mutabCopy方法
      • NSCopying 与 NSMutableCopy 协议
      • 深拷贝与浅拷贝
      • setter方法的复制选项

字符串(NSString && NSMutableString)

功能:

  1. 创建字符串:可以用init也可以string开头的类方法最后是@“”直接给字符串赋值
  2. 读取文件或网络URL初始化
  3. 将字符串的内容写入文件或URL
  4. 获取字符串长度,既可以获取字符串内包括的字符个数,也可以获取字符串包括的字节个数
  5. 连接,分割,查找字串或字符,替换字符,比较字符串,比较字符串大小,大小写转化

下面的代码给出了我们的三种不同的创建方式。

int main(int argc, const char * argv[]) {@autoreleasepool {unichar data[6] = {97, 98, 99, 100, 101, 102};NSString* str = [[NSString alloc] initWithCharacters:data length:6];NSLog(@"%@", str);char* str1 = "Hello world";NSString* str2 = [NSString stringWithUTF8String:str1];NSLog(@"%@", str2);[str2 writeToFile:@"myfile.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];NSString* str3 = [NSString stringWithContentsOfFile:@"NSString.m"encoding:NSUTF8StringEncoding error:nil];NSLog(@"%@", str3);}return 0;
}

打印结果如下:(这里我们也会同时创建一个文件)

在这里插入图片描述

NSString的其他功能

int main(int argc, const char * argv[]) {@autoreleasepool {NSString* str = @"hello";NSString* book = @"iOS";str = [str stringByAppendingString:@"iOS!"];NSLog(@"%@", str);const char* cstr = [str UTF8String];NSLog(@"%s", cstr);str = [str stringByAppendingFormat: @"%@是一本不错的书", book];NSLog(@"%@", str);NSLog(@"个数为%lu", [str length]);NSLog(@"按照UTF-8解码后的字节个数为%lu", [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);NSString* s1 = [str substringToIndex:10];NSLog(@"%@", s1);NSString* s2 = [str substringFromIndex: 5];NSLog(@"%@", s2);NSString* s3 = [str substringWithRange: NSMakeRange(5, 10)];NSLog(@"%@", s3);NSRange pos = [str rangeOfString:@"iOS"];NSLog(@"iOS出现的位置%ld, 长度%ld", pos.location, pos.length);str = [str uppercaseString];NSLog(@"%@", str);}return 0;
}

上面的代码运用了一个NSRange类型的变量,这个是一个结构体而不是一个类,其包括了包括了location和length两个unsigned int整型值,分别代表起始位置和长度。

结果为:

在这里插入图片描述
在修改字符串的时候,由于NSString字符串不可改变,因此实际上原来的字符串对象并不改变,只是将新生成的字符串重新赋值给原来的指针变量。

str1 = [str1 stringByAppendingString: @“,iOS!”];

NSMutableString

NSString字符串是不可变的字符串,即一旦NSString对象被创建,其中的字符序列就不能更改了。而NSMutableString字符串就不一样了,它的字符串序列是可更改的。而且NSMutableString是NSString的子类,NSString的方法,NSMutableString都可以直接使用。

int main(int argc, const char * argv[]) {@autoreleasepool {NSString* book = @"疯狂iOS讲义";NSMutableString* str1 = [NSMutableString stringWithString: @"Hello"];[str1 appendString:@"iOS"];NSLog(@"%@", str1);[str1 appendFormat:@"%@,是一本很不错的书籍", book];NSLog(@"%@", str1);[str1 insertString:@"fkit.org" atIndex:6];NSLog(@"%@", str1);[str1 deleteCharactersInRange:NSMakeRange(6, 12)];NSLog(@"%@", str1);[str1 replaceCharactersInRange:NSMakeRange(6, 12) withString:@"Objective-C"];NSLog(@"%@", str1);}return 0;
}

程序运行结果:

在这里插入图片描述

而在NSMutableString的代码中,由于NSMutableString的字符串是可变的,因此修改字符串的时候,字符串所包含的字符序列本身就发生了改变,因此无需重新赋值。

日期与时间 (NSDate)

2.1 日期与时间(NSDate)

OC提供了NSDate、NSCalendar对象。

其中,NSDate对象代表日期与时间,OC既提供了类方法来创建NSDate对象,也提供了大量init开头的方法来初始化NSDate对象。创建NSDate的类方法和实例方法基本相似,只是类方法以date开头,实例方法以init开头。

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {NSDate *date1 = [NSDate date]; //获取当前时间NSLog(@"%@",date1);NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSinceNow:3600 * 24];//获取从当前时间开始的后一天的时间NSLog(@"%@",date2);NSDate *date3 = [[NSDate alloc] initWithTimeIntervalSinceNow:-3 * 3600 * 24];//获取从现在开始三天前的时间NSLog(@"%@",date3);NSDate *date4 = [[NSDate alloc] initWithTimeIntervalSince1970:3600 * 24 * 366 * 20];//获取从1970年1月1日开始往后20年的时间NSLog(@"%@",date4);NSLocale *cn = [NSLocale currentLocale];//NSLocale代表一个语言,这里表示中文NSLog(@"%@",[date1 descriptionWithLocale: cn]);//用中文输出date1的时间NSDate *earlier = [date1 earlierDate: date2];NSLog(@"%@",earlier);//获取两个时间中较早的时间NSDate *later = [date1 laterDate: date2];NSLog(@"%@",later);//获取两个时间中较晚的时间//比较两个日期用:compare:方法,它包括如下三个值//三个值分别代表调用compare的日期位于被比较日期之前、相同、之后switch([date1 compare: date3]) {case NSOrderedAscending: NSLog(@"date1在date3之前");break;case NSOrderedSame: NSLog(@"date1和date3时间想相同");break;case NSOrderedDescending: NSLog(@"date1在date3时间之后");break;}NSLog(@"date1和date3的时间差是%g秒",[date1 timeIntervalSinceDate: date3]);//获取两个时间的时间差NSLog(@"date2与现在的时间差%g秒",[date2 timeIntervalSinceNow]);//获取指定时间和现在的时间差}return 0;
}

这里就表现出了创建NSDate的方法,一种是类方法,一种是实例方法,我们重点记忆类方法以date开头,实例方法以init开头这一句话

2.2日期格式器

NSDateFormatter代表一个日期格式器,它的作用就是完成NSDate和NSString之间的转换。在进行转换时,我们首先需要创建一个NSDateFormatter对象,然后调用该对象的setDateStyle:、setTimeStyle:方法设置格式化日期、时间的风格。其中日期、时间风格支持以下几个枚举值:

  • NSDateFormatterNoStyle: 不显示日期,时间的风格
  • NSDateFormatterShortStyle:显示短日期,时间风格。
  • NSDateFormatterMediumStyle:显示中等日期,时间风格。
  • NSDateFormatterLongStyle:显示长日期,时间风格
  • NSDateFormatterFullStyle:显示完整日期,时间风格

如果打算用自己的模版就调用setDateFormate:方法来设置日期,时间的模版

如果需要将NSDate转化为NSString,就是stringFromDate:相反则就是调用dateFromString:

int main(int argc, const char * argv[]) {@autoreleasepool {NSDate* date = [NSDate dateWithTimeIntervalSince1970:3600 * 24 * 366 * 20];NSLocale* locals[] = {[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"], [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]};NSDateFormatter* df[8];for (int i = 0; i < 2; i++) {df[i * 4] = [[NSDateFormatter alloc] init];[df[i * 4] setDateStyle: NSDateFormatterShortStyle];[df[i * 4] setDateStyle: NSDateFormatterShortStyle];[df[i * 4] setLocale: locals[i]];df[i * 4 + 1] = [[NSDateFormatter alloc] init];[df[i * 4 + 1] setDateStyle: NSDateFormatterMediumStyle];[df[i * 4 + 1] setDateStyle: NSDateFormatterMediumStyle];[df[i * 4 + 1] setLocale: locals[i]];df[i * 4 + 2] = [[NSDateFormatter alloc] init];[df[i * 4 + 2] setDateStyle: NSDateFormatterLongStyle];[df[i * 4 + 2] setDateStyle: NSDateFormatterLongStyle];[df[i * 4 + 2] setLocale: locals[i]];df[i * 4 + 3] = [[NSDateFormatter alloc] init];[df[i * 4 + 3] setDateStyle: NSDateFormatterFullStyle];[df[i * 4 + 3] setDateStyle: NSDateFormatterFullStyle];[df[i * 4 + 3] setLocale: locals[i]];}for (int i = 0; i < 2; i++) {switch (i) {case 0:NSLog(@"中国各式");break;case 1:NSLog(@"美国格式");break;}NSLog(@"SHORT: %@", [df[i * 4] stringFromDate: date]);NSLog(@"MEDIUM: %@", [df[i * 4 + 1] stringFromDate: date]);NSLog(@"LONG: %@", [df[i * 4 + 2] stringFromDate: date]);NSLog(@"FULL: %@", [df[i * 4 + 3] stringFromDate: date]);}NSDateFormatter* df2 = [[NSDateFormatter alloc] init];[df2 setDateFormat:@"公元yyyy年MM月DD日HH时mm分"];NSLog(@"%@", [df2 stringFromDate:date]);NSString* datestr = @"2013-03-02";NSDateFormatter* df3 = [[NSDateFormatter alloc] init];[df3 setDateFormat:@"yyyy-MM-dd"];NSData* date2 = [df3 dateFromString: datestr];NSLog(@"%@", date2);}return 0;
}

在这里插入图片描述

日历与日期组件

为了方便分开处理NSDate所包含的三个数据:年份,月份,日期。OC引入了NSCalendar对象。该方法包含如下两个常用方法:

  • (NSDateComponents*)components:formDate:从NSDate提取年,月,日,时,分,秒各时间字段的信息。
  • dateFromComponents:(NSDateComponents*) comps:使用comps对象包含的年,月,分,秒的各时间字段的信息。

NSDateComponents对象,该对象封装年月日时分秒各时间字段的信息。

我们从NSDate对象中分开获取各时间字段的数值的步骤如下:

  • 创建NSCalendar对象
  • 调用NSCalendar的方法来获取NSDate对象中各时间字段的数值,该方法返回一个NSDateComponents对象。
  • 调用NSDateComponents对象的getter方法。

很容易理解如果我们通过各个时间段的数值来初始化NSDate对象的步骤与上面差别不大,我们只需要把getter方法改成setter方法。

int main(int argc, const char * argv[]) {@autoreleasepool {NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian];NSDate* dt = [NSDate date];unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond | NSCalendarUnitWeekday;NSDateComponents* comp=[gregorian components: unitFlags fromDate:dt];NSLog(@"%ld年", comp.year);NSLog(@"%ld月", comp.month);NSLog(@"%ld日", comp.day);NSLog(@"%ld分", comp.minute);NSLog(@"%ld秒", comp.second);NSDateComponents* comp2 = [[NSDateComponents alloc] init];comp2.year = 2024;comp2.month = 5;comp2.day = 6;comp.hour = 18;comp.minute = 34;NSDate* date = [gregorian dateFromComponents: comp2];NSLog(@"%@", date);}return 0;
}

这部分是一个从NSDate对象中分开获取各时间字段的数值的方式,以及通过各项数值重新获取到我们的NSDate数据。

在这里插入图片描述

定时器(NSTimer)

当程序需要让某个方法重复执行,可以借助OC中的定时器来完成。

通过调用NSTimer的scheduledTimerWithTimeInterval: invocation: repeats:或scheduledTimerWithTimeInterval: targe:selector: userInfo: repeats:类方法来创建NSTimer对象。调用该方法时需要传入以下参数:

1、timeInterval:指定每隔多少秒执行一次任务

2、invocation或target与selector:指定重复执行的任务。如果指定target和selector参数,则指定用某个对象的特定方法作为重复执行的任务;如果指定invocation参数,该参数需要传入一个NSInvocation对象,该对象也是封装target和selector的,其实也是指定用某个对象的特定方法作为重复执行的任务。

3、userInfo:该参数用于传入额外的附加信息。

4、repeats:该参数需要指定一个BOOL值,该参数控制是否需要重复执行任务。

笔者这里还不会使用,之后会进行一个补充。

对象复制

copy与mutabCopy方法

  • copy方法返回的是对象不可修改的副本,即使该对象本身是可修改的。

  • mutableCopy方法用于复制对象的可变副本。通常来说,mutableCopy方法总是返回该对象可修改的副本,即使被复制的对象本身是不可修改的。

无论如何,copy和mutabCopy返回的总是原对象的副本,当程序对于复制的副本进行修改的时候,原对象通常不会受到影响。

int main(int argc, const char * argv[]) {@autoreleasepool {NSMutableString* book = [NSMutableString stringWithString:@"疯狂iOS讲义"];NSMutableString* bookCopy = [book mutableCopy];[bookCopy replaceCharactersInRange:NSMakeRange(2, 3) withString:@"Android"]; // range中第一个是替换的位置,第二个是替换的长度NSLog(@"book的值为:%@", book);NSLog(@"bookCopy为:%@", bookCopy);NSString* str = @"fkit";NSMutableString* strCopy = [str mutableCopy];[strCopy appendString:@".org"];NSLog(@"%@", strCopy);NSMutableString* bookCopy2 = [book copy];//程序将返回一个不可修改的副本[bookCopy2 appendString:@"aa"]//这段代码因为我们的bookCopy方法是不可变副本所以会报错。}return 0;
}

这是上面代码的一个结果:

在这里插入图片描述

tips: 副本的可不可变和他的复制方式有关,而与他的复制对象无关

NSCopying 与 NSMutableCopy 协议

int main(int argc, const char * argv[]) {@autoreleasepool {FKDog* dog1 = [[FKDog alloc] init];dog1.name = [NSMutableString stringWithString:@"旺财"];dog1.age = 20;FKDog* dog2 = [dog1 copy];}return 0;
}

这段代码可以通过编译但是却不能够运行,所以我们为了保证一个对象可以调用copy和mutableCopy方法,我们就要通过实现它的NSCopying协议和重写copyWithZone方法。在这里我们调用了allocWithZone因为这个方法可以指定新对象分配内存的位置,如果没有指定分配内存的位置,allocWithZone 方法就会使用默认的分配器来分配内存。

@implementation FKDog
- (id)copyWithZone:(NSZone *)zone {NSLog(@"执行copy");FKDog* dog = [[[self class] allocWithZone:zone] init];dog.name = self.name;dog.age = self.age;return dog;
}
- (NSString*) description {return [NSString stringWithFormat:@"<dog[name = %@, age = %d]>", self.name, self.age];
}
@end

然后我们在主函数增加一条语句:dog2.name = [NSMutableString stringWithString:@"snoopy"];结果为:

在这里插入图片描述

按照我们的一个常理来说,我们的copy方法按照要求是不可以修改的,但是这里却可以修改,这是因为我们没有给我们的FKDog类提供相应的不可变类,如果提供了不可变类,当然还是应该让FKDog的copyWithZone:返回不可变的FKDog对象。

需要指出的是,如果重写copyWithZone:方法时,他的父类也是已经实现了NSCopying协议,并且重写该方法,那么子类重写该方法的时候应该先调用父类的copy方法复制从父类继承的到成员变量,然后对子类中定义的成员变量进行赋值。

- (id) copyWithZone:(NSZone*)zone {id obj = [super copy];//对子类定义的成员变量赋值return obj;
}

深拷贝与浅拷贝

首先我们来看一下我们的代码来帮助我们理解这部分内容。

#import <Foundation/Foundation.h>
#import "FKDog.h"
int main(int argc, const char * argv[]) {@autoreleasepool {FKDog* dog1 = [[FKDog alloc] init];dog1.name = [NSMutableString stringWithString:@"旺财"];dog1.age = 20;FKDog* dog2 = [dog1 copy];NSLog(@"%@", dog1);[dog2.name replaceCharactersInRange:NSMakeRange(0, 2) withString:@"anocpy"];NSLog(@"%@", dog2);NSLog(@"%@", dog1);}return 0;
}

打印结果如下:

在这里插入图片描述

这里发现我们同时修改了dog1,dog2两个对象的name属性值,这里的主要问题就是在于我们自己写的**copyWithZone:**方法。dog.name = self.name这个语句实际上是将两个指针指向了同一块内存。

在这里插入图片描述

原因是:FKDog的对象的name是一个指针变量,该变量中村方法的只是字符串的地址,而不是字符串本身,所以当我们的对象的实例变量是指针变量时候,如果程序只是赋值该指针的地址,而不是真正复制指针所指向的对象,这种方式就被称为一个“浅拷贝”

请添加图片描述

而深拷贝则不一样,它不仅会复制对象本身,而且会递归的复制每一个指针变量的实例变量,直到两个对象没有任何公用的部分。我们只需要修改一条语句就可以了dog.name = [self.name mutableCopy];dog.name = dog,name两条语句替换就可以实现一个深拷贝

一般来说,深拷贝的实现难度会比较大,所以Foudation框架中的类大部分只实现了浅拷贝。

setter方法的复制选项

在之前的学习中我们学习了copy这个指示符,该指示符就是指定当程序调用setter方法复制时,实际上是将传入的参数的副本赋值给程序的实例变量。

我们实现一个我们的接口部分的代码,用一个copy指示符来定义一个我们的属性。

@interface FKItem : NSObject
@property (nonatomic, copy) NSMutableString* name;
@end

主函数部分:

int main(int argc, const char * argv[]) {@autoreleasepool {FKItem* item = [[FKItem alloc] init];item.name = [NSMutableString stringWithString:@"疯狂iOS讲义"];[item.name appendString:@"fkit"]; //此处代码会报错。}return 0;
}

这里我们的代码会报错,但是我们定义的一个接口部分的代码定义的明明是NSMutableString这个可变类型,但是为什么我们会出现无法复制的原因是我们的setName方法的缘故。

- (void) setName: (NSMutableString*) aname {name = [aname copy];
}

这个部分我们的copy方法默认是复制该对象的不可变副本,虽然设置的是一个NSMutableString但是实际上我们得到的却是不可变字符串。

相关文章:

OC foudation框架(上)学习

foundation框架 文章目录 foundation框架字符串&#xff08;NSString && NSMutableString&#xff09;NSString的其他功能NSMutableString 日期与时间 &#xff08;NSDate&#xff09;2.1 日期与时间&#xff08;NSDate&#xff09;2.2日期格式器日历与日期组件定时器&…...

【机器学习300问】83、深度学习模型在进行学习时梯度下降算法会面临哪些局部最优问题?

梯度下降算法是一种常用的优化方法&#xff0c;用于最小化损失函数以训练模型。然而&#xff0c;在使用梯度下降算法时&#xff0c;可能会面临以下局部最优问题。 &#xff08;一&#xff09;非凸函数的局部极小值 问题描述&#xff1a;在复杂的损失函数中&#xff0c;如果目…...

基于springboot的校园管理系统源码数据库

基于springboot的校园管理系统源码数据库 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;校园管理系统当然也不能排除在外。校园管理系统是以实际运用为开发背景&#xff0c;…...

图形网络的自适应扩散 笔记

1 Title Adaptive Diffusion in Graph Neural Networks&#xff08;Jialin Zhao、Yuxiao Dong、Ming Ding、Evgeny Kharlamov、Jie Tang&#xff09;【NIPS 2021】 2 Conclusion The neighborhood size in GDC is manually tuned for each graph by conductin…...

vue基础配置

vite.config.ts import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path"; //引入svg需要用到的插件 import { createSvgIconsPlugin } from vite-plugin-svg-icons //mock插件提供方法 import { viteMockServe } from vite-…...

C++基础中的存储类别

存储的类别是变量的属性之一&#xff0c;C语言定义了4种变量的存储类别&#xff0c;分别是auto变量、static变量、register变量和extern变量。以下重点介绍这几种类型。 一、auto变量 auto变量是C默认的存储类型。函数内未加存储类型说明的变量均被称为自动变量&#xff0c;即…...

【NPM】Nginx Proxy Manager 一键申请 SSL 证书,自动续期,解决阿里云SSL免费证书每3个月失效问题

文章目录 1、NPM 简介2、实战Step 1&#xff1a;环境搭建 也可以看作者安装笔记 Step 2&#xff1a;创建容器 2.1 在系统任意位置创建一个文件夹&#xff0c;此文档以~/nginx-proxy-manager为例。2.2 创建docker-compose.yaml2.3 启动NPM服务 Step 3&#xff1a;配置反向代理3…...

教你解决PUBG绝地求生游戏中闪退掉线无法重连回去的问题

《绝地求生》&#xff08;PUBG&#xff09;&#xff0c;作为一款在全球范围内掀起热潮的战术竞技游戏&#xff0c;以其栩栩如生的战场环境和令人心跳加速的生存冒险博得了广大玩家的青睐。然而&#xff0c;一些玩家在经历了一场惊心动魄的对局后&#xff0c;却面临了一个不大不…...

24 Debian如何配置Apache2(4)LAMP+phpMyAdmin部署

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置Apache2(4)LAMP+phpMyAdmin部署 《傅老师Debian小知识库系列之24》——原创 ==前言== 傅老师Debian小知识库特点: 1、最小化拆解Debian实用技能; 2、所有操作在VM虚拟机实测完成;…...

centos安装paddlespeech各种报错解决方案

背景 windows系统安装paddlespeech一路顺利 centos安装之前也是正常 今天centos再次安装各种报错,避免以后遇到浪费时间,记录下来,也给大家节约时间 报错 报错1 module numpy has no attribute complex. 解决方案 降低numpy # 1. 卸载当前numpy库 pip uninstall numpy…...

谈基于ATTCK框架的攻击链溯源

引言 网络安全在当今数字化时代变得尤为关键&#xff0c;而MITRE公司开发的ATT&CK框架则成为了安全专业人员的重要工具。ATT&CK是一种广泛使用的攻击行为分类和描述框架。其目的在于提供一个共同的语言&#xff0c;使安全专业人员能够更好地理解攻击者的行为和目标&…...

在Ubuntu下搭建自己的以太坊私有链

最近要对链及链上应用进行压测,为了方便操作及分析问题,就自己搭建了一个eth私链。当前版本安装官方指引发现有卡点,于是决定整理一个文档,为其他有需要的朋友提供便捷操作,节约时间。 一、环境配置 linux操作系统:Ubuntu 20.04.6 LTS (Focal Fossa) go version: go1…...

巩固学习4

python中函数逆置的几种方法 s input()for i in range(len(s)-1,-1,-1):#从最后一位开始&#xff0c;步长为-1print(s[i],end)用for语句循环逆置 s input() s list(s) n len(s) for i in range(n//2):s[i],s[n-1-i] s[n-1-i],s[i]#从中间反转字符串 res "".j…...

Conda安装rasterio报错

Conda安装rasterio报错 文章目录 Conda安装rasterio报错问题解决参考 问题 在conda环境中安装rasterio包之后&#xff0c;本来可以正常运行的&#xff0c;但是之后又重新安装了一个gdal&#xff0c;导致原来的引用rasterio的包的程序不可正常运行了 conda install rasterio c…...

linux安装 mysql

环境&#xff1a;centOS8 一、安装 1 安装wget库 sudo yum -y install wget 2. 安装 mysql 换yum源 亲测成功&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 换yum源 1.下载对应版本的repo文件 wget -O CentOS-Base.repo http://mirrors…...

暴力法解决最近对问题和凸包问题-实现可视化

目录 最近对问题 凸包问题 最近对问题 顾名思义就是采用蛮力法求出所有点之间的距离&#xff0c;然后进行比较找出第一个最近对&#xff0c;一个一个进行比较。 大概思路就是如图&#xff08;每个圈代表一个数对&#xff09; 第一个和其他四个比较 第二个和其他三个比较 …...

[Kubernetes] Rancher 2.7.5 部署 k8s

server: 192.168.66.100 master: 192.168.66.101 node1: 192.168.66.102 文章目录 1.rancher server 安装docker2.部署k8s3.kubeconfig4.测试集群 1.rancher server 安装docker 所有主机开通ipv4 vi /etc/sysctl.conf#加入 net.ipv4.ip_forward 1#配置生效 sysctl -prancher…...

码题杯 世界警察 思想:双指针

https://www.matiji.net/exam/brushquestion/4/4446/16A92C42378232DEB56179D9C70DC45C 双指针 思路是这样的&#xff0c;首先r指针向右走&#xff0c;如果r指针遇到了和l指针一样的&#xff0c;那么l指针就&#xff0c;一直加到r指针的位置&#xff0c;此时a[l]a[r]&#xff0…...

drawio 网页版二次开发(1):源码下载和环境搭建

目录 一 说明 二 源码地址以及下载 三 开发环境搭建 1. 前端工程地址 2. 配置开发环境 &#xff08;1&#xff09;安装 node.js &#xff08;2&#xff09;安装 serve 服务器 3. 运行 四 最后 一 说明 应公司项目要求&#xff0c;需要对drawio进行二次开发&…...

算法训练Day33 |● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

509. 斐波那契数 class Solution { public:int fib(int n) {if(n<1) return n;int pre2 0;int pre1 1;int result 0;for(int i2; i<n; i ){result pre1pre2;pre2 pre1;pre1 result;}return result;} };参考文章&#xff1a;代码随想录- 509. 斐波那契数 70. 爬楼梯…...

【算法】滑动窗口——将x减到0的最小操作数

本节博客主要是讲的我解“将x减到0的最小操作数”这道题的思路历程&#xff0c;从最开始的想法到代码提交的详细记录&#xff0c;有需要借鉴即可。 目录 1.题目2.代码示例3.细节3.1left越界3.2特殊情况 4.总结 1.题目 题目链接&#xff1a;LINK 看题目意思是就是给你一个数X&…...

《引爆流量获客技术》实操方法,手把手教你搭建盈利流量池

[1]-先导课.mp4 [2]-第1节&#xff1a;设计客户终身价值的方法和买客户思维.mp4 [3]-第2节&#xff1a;【渠道模型】解决谁是我的客户如何找到.mp4 [4]-第3节&#xff1a;【诱饵模型】解决 如何获得更多的客户.mp4 [5]-第4节&#xff1a;【钩子模型】解决让目标客户主动找你…...

【记录】常见的前端设计系统(Design System)

解释一下设计系统的定义&#xff0c;以及在国内&#xff0c;都有那些优秀的设计系统可以学习&#xff0c;希望可以帮到大家。 什么是设计系统&#xff08;Design System)&#xff1f; 设计系统&#xff08;Design System&#xff09;是一套综合性的指导原则、组件和规则&…...

如何使用Whisper音频合成模型

Whisper 是一个通用语音识别模型&#xff0c;由 OpenAI 开发。它可以识别多种语言的语音&#xff0c;并将其转换为文本。Whisper 模型采用了深度学习技术&#xff0c;具有高准确性和鲁棒性。 1、技术原理及架构 Whisper 的工作原理&#xff1a;音频被分割成 30 秒的片段&#…...

网络相关笔记

IPv4地址 IPv4地址通常以“点分十进制”形式书写&#xff0c;即四个0-255之间的十进制数&#xff0c;各数之间用英文句点&#xff08;.&#xff09;分隔&#xff0c;例如&#xff1a;192.0.2.1。总共32位的地址空间可以表示大约42亿个不同的地址。 IPv4地址结构包括&#xff…...

由C# yield return引发的思考

前言 当我们编写 C# 代码时&#xff0c;经常需要处理大量的数据集合。在传统的方式中&#xff0c;我们往往需要先将整个数据集合加载到内存中&#xff0c;然后再进行操作。但是如果数据集合非常大&#xff0c;这种方式就会导致内存占用过高&#xff0c;甚至可能导致程序崩溃。 …...

【问题解决】EasyExcel导出数据,并将数据中的实体类url转为图片

EasyExcel导出数据&#xff0c;并将数据中的实体类url转为图片 在导出excel数据时&#xff0c;用户要求把存储二维码url转为图片保存&#xff0c;然后研究了一下具体实现。 代码展示&#xff1a; public void exportData(String pointName, String districtName, String str…...

winform植物大战僵尸

winform植物大战僵尸 植物大战僵尸源码 半成品 需要的拿去学习 登陆注册选择关卡 向日葵 豌豆射手 双枪豌豆射手 项目获取&#xff1a; 项目获取&#xff1a;typora: typora/img (gitee.com) 备用项目获取链接1&#xff1a;yifeiyixiang/kamo: 源码下载 (github.com) 备用…...

Pointnet++改进即插即用系列:全网首发UIB轻量化模块

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入UIB,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三...

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件 背景 之前开发调试了个能正常调用ffmpeg解码mp4文件得到yuv数据的testbed(把ffmpeg开源库移植并交叉编译到一个嵌入式平台)&#xff0c;用了好几年了&#xff0c;今天用来挂测一批新的采集视频mp4文件&#x…...