axios拦截器

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios' // const showStatus = (status) => { //   let message = '' //   switch (status) { //     case 400: //       message = '请求错误(400)' //       break //     case 401: //       message = '未授权,请重新登录(401)' //       break //     case 403: //       message = '拒绝访问(403)' //       break //     case 404: //       message = '请求出错(404)' //       break //     case 408: //       message = '请求超时(408)' //       break //     case 500: //       message = '服务器错误(500)' //       break //     case 501: //       message = '服务未实现(501)' //       break //     case 502: //       message = '网络错误(502)' //       break //     case 503: //       message = '服务不可用(503)' //       break //     case 504: //       message = '网络超时(504)' //       break //     case 505: //       message = 'HTTP版本不受支持(505)' //       break //     default: //       message = `连接出错(${status})!` //   } //   return `${message},请检查网络或联系管理员!` // } const http = axios.create({        // 联调   // baseURL: process.env.NODE_ENV === 'production' ? `https://www.artype.cn` : 'https://www.artype.cn',   baseURL: process.env.NODE_ENV === 'production' ? `http://card.artype.cn` : 'http://www.sc.cn', //   headers: { //     get: { //       'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' //     }, //     post: { //       'Content-Type': 'application/json;charset=utf-8' //     // 'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8' //     } //   },   // 是否跨站点访问控制请求 //   withCredentials: true, //   timeout: 30000, //   transformRequest: [(data) => { //     data = JSON.stringify(data) //     return data //   }], //   validateStatus () { //     // 使用async-await,处理reject情况较为繁琐,所以全部返回resolve,在业务代码中处理异常 //     return true //   }, //   transformResponse: [(data) => { //     if (typeof data === 'string' && data.startsWith('{')) { //       data = JSON.parse(data) //     } //     return data //   }] }) // // 请求拦截器 // http.interceptors.request.use((config) => { //     return config // }, (error) => { //     // 错误抛到业务代码 //     error.data = {} //     error.data.msg = '服务器异常,请联系管理员!' //     return Promise.resolve(error) // }) // 响应拦截器 // http.interceptors.response.use((response) => { //     const status = response.status //     let msg = '' //     if (status < 200 || status >= 300) { //         // 处理http错误,抛到业务代码 //         msg = showStatus(status) //         if (typeof response.data === 'string') { //             response.data = {msg} //         } else { //             response.data.msg = msg //         } //     } //     return response // }, (error) => { //     // 错误抛到业务代码 //     error.data = {} //     error.data.msg = '请求超时或服务器异常,请检查网络或联系管理员!' //     return Promise.resolve(error) // }) export default http

导航站汇总

1、设计: seeseed.com:Seeseed-无穷尽设计可能 设计狮:设计狮 - 深受设计师喜欢可自定义的设计导航 (998877.com.cn) 设计导航 - 精选最好的设计网站大全 (shejidaren.com) 优设导航官网:https://hao.uisdc.com/ 2、产品: 阿猫阿狗:产品经理导航 | 运营导航-互联网人必备网址导航 (pmbaobao.com) 产品经理网址导航 - 超级产品经理导航 (imspm.com) 创造狮:创造狮 创意工作者导航 (chuangzaoshi.com) 3、开发: http://www.devnav.cn/ 个人技术分享 (cxy521.com) 程序员导航 (cxysite.com) 编程导航 - 程序员导航 (code-nav.cn) 是tab页 程序员导航网 | 码农必备网址大全 (panziye.com) 程序员导航丨前端开发设计师网址大全 | (webmuban.com) 4、运营: 产品运营导航-网站产品运营网址工具导航_爱运营 (iyunying.org) 淘客工具:淘客工具网 | 做淘客必备的淘客软件集合网站 (taoketool.cn) 5、广告营销 addog:addog.vip | 广告人的网址导航 | 品牌/策划/营销/创意/文案 6、数据导航:大数据导航-大数据工具导航-199IT大数据导航-199IT大数据工具导航-Hao.199it.com 7、财经导航:财经网址导航 - 雪球 (xueqiu.com) 8、政府部门导航:打假导航-我的个人网址导航 (dajiadaohang.com) 9、书享家:电子书导航站:http://shuxiangjia.cn/ 10、学吧导航:学吧导航 | 四十万学习爱好者都在用的学习导航网站 (xue8nav.com) 11、科塔学术:科塔学术 - 科研与学术资源导航平台 | www.sciping.com 12、hiPPter:HiPPTER | PPT资源导航 | PPT模板图表等设计素材免费下载 13、搜索导航:虫部落快搜 - 搜索快人一步 - Google (chongbuluo.com) 14、工具 在线工具 - 你的工具箱 (tool.lu) 15、其他 达牛科技 | 导航湾-创造和分享导航 (daohangwan.com)

01_框架gin笔记

一、安装 go mod init ginchat go get -u github.com/gin-gonic/gin 如果报错输入以下命令解决 go env -w GOPROXY="https://goproxy.io" 或者 go env -w GOPROXY="https://goproxy.cn" go env -w GO111MODULE="on" 还报错就 go env -w GOSUMDB=off 二、基础服务 package main import ( "github.com/gin-gonic/gin" "log" "fmt" ) func main(){ engine:=gin.Default() engine.GET("/hello",func(context *gin.Context){ fmt.Print("hello world:",context.FullPath()) // 后端打印 name:=context.DefaultQuery("name","hello") //获取get请求参数name 如果没有则默认值为 hello context.Writer.Write([]byte("hello,gin\n")) // 前端输出 }) engine.Handle("POST","/login",func(context *gin.Context){ username:=context.PostForm("username") //获取post 参数 username username,exist:=context.GetPostForm("username") // 获取post 参数username 如果存在则exist为ture 否则为false }) // 路径中的变量加冒号 engine.DELETE("/user/:id",func(context *gin.Context){ userId:=context.Param("id") //获取路径中的变量值 }) if err:=engine.Run();err!=nil { log.Fatal(err.Error()) } } 三、请求数据绑定 type Student struct{ Name string `form:"name"` //绑定参数中的name Classes string `form:"classes"` //绑定参数中的classes } 1、绑定get请求数据 var student Student err:= context.ShouldBindQuery(&student) if err != nil { log.Fatal(err.Error()) return } 2、绑定post form 表单请求数据 err:= context.ShouldBind(&student) 可接收 ajax 的object{key:value} 或 form.serialize(key=val&key=val) 数据 3、绑定post json数据 err:=context.BindJSON(&student) 4、解析body type Person struct { Name string `json:"name"` Code string `json:"code"` } json.NewDecoder(context.Request.Body).Decode(&person ) ajax 传 JSON.stringify(objct) 5、接收file file,err:=context.FormFile("file") 四、输出 4.1、context.Writer.Write([]byte("hello")) // 4.2、context.Writer.WriteString("hello") 4.3、context.JSON(200,map[string]interface{}{ "code":1, "message":"请求成功", "data":name, }) 4.4、 type Response struct{ Code int Message string Data interface{} } resp:=Response{Code:1,Message:"ok",Data:name} context.JSON(200,&resp) 4.5、加载html engine.LoadHTMLGlob("./html/*") //加载html资源引擎 enginx.Static("/img","./img") //加载静态资源映射 context.HTML(http.StatusOK,"index.html",nil) context.HTML(http.StatusOK,"index.html",gin.H{ "resp":resp, }) html模板引擎获取数据 {{.resp.Code}} 五、路由组 userGroup :=engine.Group("/user") 六、渲染带html 标签的字符串 app:=gin.Default() app.SetFuncMap(template.FuncMap{ "safe": func(str string) template.HTML { return template.HTML(str) }, "trimHtml": func(src string) string { //将HTML标签全转换成小写 re, _ := regexp.Compile("\\<[\\S\\s]+?\\>") src = re.ReplaceAllStringFunc(src, strings.ToLower) //去除STYLE re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>") src = re.ReplaceAllString(src, "") //去除SCRIPT re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>") src = re.ReplaceAllString(src, "") //去除所有尖括号内的HTML代码,并换成换行符 re, _ = regexp.Compile("\\<[\\S\\s]+?\\>") src = re.ReplaceAllString(src, "\n") //去除连续的换行符 re, _ = regexp.Compile("\\s{2,}") src = re.ReplaceAllString(src, "\n") return strings.TrimSpace(src) }, }) //模板里 {{.content|safe}} //解析html标签 {{.content|trimHtml}} // 去除html标签 userGroup.GET("/login",func(context *gin.Context){})

02_框架gin笔记

六、mysql 安装驱动 go get "github.com/go-sql-driver/mysql" import _ "github.com/go-sql-driver/mysql" import ( _ "github.com/go-sql-driver/mysql" "database/sql" ) connstr:="root:password@tcp(127.0.0.1:3306)databasename" db,err :=sql.Open("mysql",connStr) if err != nil { log.Fatal(err.Error()) return } 创建表 _,err = db.Exec("create table person("+ "id int auto_increment primary key," + "name varchar(12) not null,"+ "age int default 1"+ )") 插入 _,err = db.Exec("insert into person (name,age) values (?,?);","username",18) 查询 type Person struct{ Id int Name string Age int } rows,err:= db.Query("slelect * from person limit 10") scan: if rows.Next(){ person:= new(Person) rows.Scan(&person.Id,&person.Nane,&person.Age) goto scan } 七、定义及调用配置文件 7.1、定义配置文件 config/app.json { "app_name":"cloudrestaurant", "app_mode":"debug", "app_host":"localhost", "app_port":"8080" } 7.2、定义解析配置文件的工具 tools/Config.go package tool import ("os" "bufio" "encoding/json") type Config struct{ AppName string `json:"app_name"` AppMode string `json:"app_name"` AppHost string `json:"app_name"` AppPort string `json:"app_name"` } var _cfg *Config=nil func ParseConfig(path string) (*Config,error){ file,err := os.Open(path) if err !=nil { panic(err) } defer file.Close() reader:=bufio.NewReader(file) decoder:=json.NewDecode(reader) if err:=decoder.Decode(&_cfg);err!=nil{ return nil,err } return _cfg,nil } 八、控制器路由 8.1、controller/HelloController.go package controller import "github.com/gin-goic/gin" type HelloController struct { } func (hello *HelloController) Router(engine *gin.Engine){ engine.GET("hello",hello.Hello) } func (hello *HelloController) Hello(context *gin.Context){ } 8.2、main.go func registerRouter(router *gin.Engine){ new(controller.HelloController).Router(router) } app:=gin.Defult() register() 九、跨域 main.go func Cors() gin.HandlerFunc { return func(context *gin.Context) { method := context.Request.Method context.Header("Access-Control-Allow-Origin", "*") context.Header("Access-Control-Allow-Headers", "Content-Type,AccessToke,X-CSRF-Token,Authorization,Token,x-token") context.Header("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,PATCH,PUT") context.Header("Access-Control-Expose-Headers", "Content-Lenth,Access-Control-Allow-Origin,Access-Control-Allow-Headers,Content-Type") context.Header("Access-Control-Allow-Credentials", "true") if method == "OPTIONS" { context.AbortWithStatus(http.StatusNoContent) //context.JSON(http.StatusOK, "Options Request!") } context.Next() } } 使用 app := gin.Default() app.Use(Cors())

04_go-redis、session、cookie

一、redis go get -u github.com/go-redis/redis var redisdb *redis.Client redisdb = redis.New(&redis.Options{ Addr:"127.0.0.1:6379", Password:"", DB:0, }) redisdb.Set("test:name","value",time.Minute * 10) 十分钟失效 二、session go get github.com/gin-contrib/sessions import "github.com/gin-contrib/sessions" 2.1、基于redis使用 在main.go 中 import( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/redis" ) engine:=gin.Default() strore,_:=redis.NewStore(10,"tpc","localhost:6379","",[]byte("secret")) engine.Use(sessions.Sessions("mysession",store)) engine.GET("/path",func(context *gin.Context){ session:=sessions.Default(context) //保存 num:=16 session.Set("count",num) session.Save() //读取 num=session.Get("count") }) json.Marshal(member) //将 member 对象序列化 session.Set("user_id",json.Marshal(member)) 反序列化 var member Member sess:=session.Get("user_id") json.Unmarshal(sess.([]byte),&member) 三、上传图片 file,err:=context.FormFile("file") filename:="./uploadPath/"+strcov.Format(time.Now().Unix(),10)+file.Filename err:=context.SaveUploadFile(file,filename) 四、cookie //设置cookie context.SetCookie("cookie_key","val",10*60,"localhost",true,true) 获取cookie cookie,err:=context.Request.Cookie("cookie_key") const CookieName="cookie_user" const CookieTiimeLen=10*60 func CookieAuth(context *gin.Context) (*http.Cookie,error){ cookie,err:=context.Request.Cookie(CookieName) if err==nil{ context.SetCookie(cookie.Name,cookie.Value,cookie.MaxAge,cookie.Path,cookie.Domain,cookie.Secure,cookie.HttpOnly) return cookie,nil }else{ return nil,err } }

03_xorm

一、安装 go get github.com/go-xorm/xorm 使用示例 // 结构体名称对应数据库表名 type Smscode struct { Id int `xorm:"pk autoincr" json:"id"` Code string `xorm:"varchar(255)" json:"code"` Phone string `xorm:"varchar(255)" json:"phone"` CreateTime int `xorm:"int" json:"create_time"` } import ( _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" ) conn := "root:password@tcp(127.0.0.1:port)/database?charset=utf8mb4" eg, err := xorm.NewEngine("mysql", conn) if err != nil { fmt.Println("链接失败") } fmt.Println("链接成功。。。") eg.ShowSQL(true) //映射结构体,好像没什么卵用 err = eg.Sync2(new(Smscode)) if err != nil { fmt.Println("映射失败") } smsCode := Smscode{Code: "123456", Phone: "15700000000", CreateTime: 12345678910} fmt.Println(smsCode) result, err := eg.InsertOne(smsCode) if err != nil { fmt.Println("插入失败") } fmt.Println(result) //事物 eg, err := xorm.NewEngine("mysql", conn) defer eg.Close() sess:=eg.NewSession() err:=sess.Begin() sess执行sql语句 sess.Rollback() sess.Commit() 条件查询 var sms model.SmsCode // eg,err:= xorm.NewEngine("mysql",[connectString]) _,err:=eg.Where("phone= ? and code = ?",phone,code).Get(&sms) 1.1、service 封装 tool/OrmEngine.go import ( "github.com/go-xorm/xorm" _ "github.com/go-sql-driver/mysql" ) type Orm struct{ *xorm.Engine } var DbEngine *Orm func OrmEngine(cfg *Config) (*Orm,error){ database : = cfg.Database conn:=database.User+":"+database.Password + "@tcp("+database.Host+":"+database.Port+")/"+database.Database+"?charset=utf8" engine,err :=xorm.NewEgine("mysql",conn) if err !=nil { return nil,err } engine.ShowSQL(true) err :=engine.Sync2(new(model.SmsCode)) orm :=new(Orm) orm.Engine =engine DbEngine = orm return orm,nil } 1.2、model调用 model/SmsCode.go type SmsCode struct { Id int64 `xorm:"pk autoincr" json:"id"` Phone string `xorm:"varchar(11)" json:"phone"` CreateTime int64 `xorm:"bigint" json:"create_time"` } 1.3、dao/MemberDao.go type MemberDao struct{ *tool.Orm } func (md *MemberDao) InsertCode(sms model.SmsCode) int64{ result,err :=md.InsertOne(&sms) //返回的是插入的id return result } 1.4、service/MemberService.go 当前时间 time.Now().Unix() smsCode:=model.SmsCode(Phone:phone,Code:code,CreateTime:time.Now().Unix()) memberDao:=dao.MemberDao{} res:=memberDao.InsertCode(smsCode)

js文件压缩

yarn add jszipyarn add file-saverimport Zip from 'jszip'import FileSave from 'file-saver'var zip = new Zip()zip.file("test.log","文件内容");zip.folder("path").file("test2.log","test2.log 的文件内容")//图片var arr = [                    {path:"https://uieditor.ui.cn/editor/lib/10/4.png"},                    {path:"https://uieditor.ui.cn/editor/lib/10/3.png"}                ]                const downloaded = await Promise.all(                    arr.map(res => {                        return fetch(res.url)                        .then(resp => resp.blob())                        .then(data => {                            return {                                ...res,                                data                            };                        });                    })                )zip.file("test.png",downloaded[0].data,{binary:true})打包压缩 并保存到本地zip.generateAsync({ type: "blob" }).then(res=>{       console.log(res)          FileSaver.saveAs(res,"test.zip") });读取压缩文件内容function readzip(e){ var zipFile=new JSZip(); zipFile.loadAsync(e.target.files[0]).then(function(zip){ zip.folder("a").file("a.txt").async("string").then(function(res){ console.log(res) }) })}

05-51cto-堆和适配器

1、堆 heap make_heap(v.begin(),v.end()) 构造堆 默认大根堆 make_heap(v.begin(),v.end(),greater<int>()) 构造小根堆 放入一个元素到堆中,使其依然是一个堆 v.push_back() push_heap(v.begin(),v.end(),greater<int>()) pop_heap 出堆 将堆顶的元素移除 pop_heap(v.begin(),v.end(),greater<int>()) v.pop_back() sort_heap(v.begin(),v.end(),greater<int>()) 将容器元素从大到小排序,破坏堆结构2、adapter 适配器 本质是自定义的方法 reverse_iterator 逆向迭代器 反向迭代器方向的迭代适配器 reverse_iterator< vector<int>::iterator > rit(v.end()) cout<< *rit << endl; ++rit; front_insert_iterator 前插迭代器 以迭代器的使用方式实现,在容器开头插入元素 deque<int> d={1,2,3} 因为vector 没有push_front 所以不能用vector front_insert_iterator< deque<int> > fit(d); *fit =11; 头部插入 元素11 back_insert_iterator 后插迭代器 以迭代器的使用方式实现,在容器末尾位置插入元素 insert_iterator 插入迭代器 以迭代器使用方式实现,在容器的某位置插入元素 insert_iterator< vector<int> > fit(v,v.begin()+2) *fit=11 在第二个位置插入11 istream_iterator 输入流迭代器 以迭代器的使用方式实现 cin>> 的功能 istream_iterator<int> itEnd; istream_iterator<int> it(std::cin); 以空格键区分元素 int num1 = *it; ++it; int num2 = *it; ostream_iterator 输出流迭代器 以迭代器的使用方式实现 cout<< 的功能3、萃取:iterator_traits vector<int>::iterator::value_type vector<int>::iterator::iterator_category vector<int>::iterator::pointer vector<int>::iterator::difference_type vector<int>::iterator::reference4、type_traits is_void<void>::value 判断是否是 void is_void<int>::value 判断int 是否为void类型 is_void<void *>::value 判断vlid * 是否是void类型 is_pointer<int *>::value 判断 int * 是否是指针类型 is_function<decltype(fun)>::value 是否是函数类型 is_array<int[3]>::value 是否是数组 is_base_of<a,b>::value a是否是b的基类 is_object<int>::value 是否是类5、空间配置器 allocator allocator<int> allo; 定义空间配置器 int *p = allo.allocate(1); 定义1个空间 allo.contstruct(p,1); 给空间赋初值 1 cout << *p << endl; 使用 allo.address(*p); 获取地址 allo.deallocator(p,1); 回收值为1的空间 allo.destroy(p)

04-51cto-算法

#include<algorithm>文档地址https://cplusplus.com/reference/algorithmvector<int> v;1、findvector<int>:iterator it=find(v.begin(),v.end(),3) 从开始到结尾查找值为3 的迭代器2、find_if2.1、bool is3(int x){ return x==3;}vector<int>::iterator it = find_if(v.begin(),v.end(),is3) ;会将begin到end的元素一个一个传入方法is3里2.2、struct is3(){ bool operator ()(int x){ return x==3; }}vector<int>::iterator it = find_if( v.begin(),v.end(),is3() );3、find_first_if(v.begin(),v.end(),v2.begin(),v2.end()))4、for_each(v.begin(),v.end(),fun) 将每个元素一次作为参数传入到一元函数fun遍历5、count(v.begin(),v.end(),2) 返回2出现的次数6、count_if(v.begin(),v.end(),fun)7、vector<int>::iterator it = search(v.begin(),v.end(),v2.begin(),v2.end())8、search_n(v.begin(),v.end(),2,4) 查找连续的两个49、random_shuffle(v.begin(),v.end()) 打乱顺序10、replace(v.begin(),v.end(),3,333) 将所有元素3 替换成33311、replace_if(v.begin(),v.end(),fun,333) 一次传入fun 返回true的元素替换成33312、replace_copy(v.begin(),v.end(),v2.begin(),3,333) 将所有元素copy到v2并将3替换成33313、fill(v.begin(),v.end(),111) 将容器v每个元素设置为11114、vector<int>::iterator it = remove(v.begin(),v.end(),3) 移除元素3,并将删除的元素的后边元素前移不改变容器大小 返回最后一个元素位置15、reverse(v.begin(),v.end()) 反转元素顺序16、unique(v.begin(),v.end()) 删除连续重复元素17、transform( v.begin(),v.end(),v2.begin(),fun) 经fun加工后的元素返回给v2划分、排序18、partition(v.begin(),v.end(),fun) 分区 将fun返回true 的放到前边,为false 的放到后边19、stable_partition(v.begin(),v.end(),fun)20、sort(v.begin(),v.end(),greater<int>()) 降序排列; 第三个参数可以不传,默认为less 升序21、stable_sort(v.begin(),v.end(),greate<int>()) 有重复的元素会有作用22、partial_sort(v.begin(),v.begin()+3,v.end(),greater<int>()) 将最大的前三个排序放到最前,其他忽略排序23、nth_element(v.begin(),v.begin()+3,v.end()) 把第n大的元素拍到第n个位置,不关心其他元素

08-boost-时间库

#include<boost/date_time/gregorian/gregorian.hpp>using namespace boost::gregorian;#pragma comment(lib,"libboost_date_time-vc141-mt-gd-x32-1_67.lib")1、构造日期 date d1(2022,2,2); date d2=from_string("2022-02-02"); date d3=from_string("2022/02/02") date d4 = from_underlimited_string("20220202"); date d5(min_date_time) date d5(max_date_time) cout << d1.year()<<(int)d1.month() << d1.day()<<endl; cout << to_simple_string(d2) to_iso_string(d3) to_iso_extended_string(d4) date today = day_clock::local_day() 获取当天日期 today.year() today.month() today.day() today.day_of_week() today.week_number() 一年中的第几周 today.day_of_year() 一年中的第几天 today.end_of_month() 这个月的结束日期 days d(1) months m(1) date d10(2022,02,02); cout<< to_iso_extended_string( d10+days(-10) ) << endl;2、date_period date d1 = date(2022,1,1) date d2 =date(2022,9,9) date_period dp1(d1,d2); cout << "日期范围" << dp1 <<endl; cout << "这个范围天数" << dp1.length() << endl; date_period dp2(d1,date_duration(30)) cout << "日期范围"<< dp2 << endl; dp1.shift(days(3)) cout << "日期范围后移3天" << dp1 << endl; dp2.expand(days(1)) cout << "日期范围向两边阔1天" << dp2 << endl; cout << "日期范围是否包含" << dp1.contains(date(2022,2,2)) <<endl; day_iterator it1(d2); 默认步长为1 day_iterator it1(d2,10); 步长为10天 ++it1; cout << *it1 <<endl; week_iterator month_iterator year_iterator3、ptime #include<boost/date_time/posix_time/posix_time.hpp> using namespace boost::posix_time ptime p1 = time_from_string("2022-2-2 02:00:00") ptime p2 = from_iso_string("20030303T030000") ptime p3 = second_clock::local_time() 本地当前时间 秒精度 ptime p4 = microsec_clock::universal_time(); UTC当前时间,微秒精度 ptime p5(min_date_time) ptime p6(max_date_time)4、获取当前格式化时间 date d1 = day_clock::local_day(); date_facet *pdf = new date_facet("%Y-%m-%d %H:%M:%S "); cout.imbue( locale(cout.getlocl(),pdf) ) cout << d1 << endl; 输出2022-09-13 12:01:01

02-51cto-STL六大组件

3、STL 六大组件 container 容器 3.1、序列容器: array vector、deque、list、forward_list、stack、queue、priority_queue 3.2、关联容器 set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset、unordered_multimaptype_id(vetor<int>::iterator::iterator_category).name() 获取迭代器类型4 动态数组: 4.1 vector<int> v; v.capacity(); 容量大小 v.size() 元素数量 v.push_back(1); 在末尾添加1 v.insert(v.begin(),3);在前面插入 元素3 v.insert(v.end(),2,5) ; 在末尾插入两个5 v.pop_back();删除最后一个元素 v.erase(v.end()-1);删除最后一个元素 v.srase(v.begin()) ; 删除第一个元素 v.clear(); 清除所有元素,但不会清除容量 v.front() 第一个元素 v.back() 最后一个元素 v.at(key) 索引为key的元素 4.2 deque<int> d; 双向迭代器 d.push_front(1) 在头部插入 元素1 vector 没有此方法 d.pop_front() 从头部删除元素, vector 没有此方法 其他方法同vector 4.3 list<int> l; 双向迭代器;不支持索引访问元素 迭代器不支持 +n -n l.front() 返回第一个元素 .lback() 返回最后一个元素 其他方法同deque 4.4 #include<forward_list> forward_list 单向迭代器 没有rbegin() 和rend();支持++ 不支持-- 支持push_front() 不支持push_back() 支持insert_after() 4.5 栈 stack<int> s; 先进后出 不支持 索引访问元素;没有迭代器 s.push() s.pop() 删除栈顶元素 s.top() 栈顶元素 s.empty() 4.6 队列 #include<queue> queue<int> q; 先进先出,没有迭代器 双端队列 q.front() 队列头元素 q.back() 队列未元素 q.pop() 4.7 #include<queue> priority_queue<int> pq 优先队列 没有迭代器 不支持front() back() pq.top() 默认先出值最大的 pq.push(1) pq.push(3) pq.push(2) 默认顺序是 3,2,1 修改默认顺序 less priority_queue<int vector<int>,greater<int>> pq 4.8 set 集合 set<int> s; 不支持索引访问元素 默认升序排列 元素不允许重复,元素不可更改 set<int greater<int>> s;降序排列 s.insert(1) 插入元素 s.insert(1) 第二次插入会失败 s.insert(1).sencond 返回1说明插入成功,0说明插入失败 s.insert(v.begin(),v.end()) 插入其他容器 s.erase(1) 删除值为1的元素 s.erese(s.begin()) s.erese(s.begin(),s.end()) s.clear() 清空 set<int>::iterator it = s.find(9) 查找返回迭代器 if(it!=s.end()){找到} 4.9 map 关联容器 map<int,string> m; 值是 pair类型 4.9.1 pair数据 pair<int, char> p(1,"a"); 或make_pair(2,"b) make_pair 会自动推导数据类型 p.first 是1 即索引, p.second 是值 即 a m.insert(pair<int,string>(2,"bb")) 插入 已存在key 无法插入 m.insert(make_pair(3,"cc")) 插入 已存在key 无法插入 m[5] = "dd" 插入 已经存在的修改 m.erase(3) 删除key为3的元素 m.erase(m.begin()) for(map<int,string>::iterator it=m.begin();it!=m.end();it++){ cout<<"索引:"<< it->first << "值:"<<it->second<<endl; } map<int,string>::iterator it=m.find(3) if(it!=m.end()){ 找到索引为3的元素 it->first it->secnod.c_str() 转换成string } cout<< m[33]..c_str() << endl; 如果没有索引为33 会插入,索引判断是否存在要用find 4.10 multiset 集合,与set的区别是允许元素重复 #include<set> m.find(1) 只能找到 第一个,返回迭代器 pair<multiset<int>::iterator,multiset<int>::iterator> pa=s.equal_range(1) 找到所有值为1 的元素,返回值为1 的第一个到走后一个的迭代器 for(multiset<int>::iterator it=pa.first;it!=pa.second;it++){ cout<< *it <<endl; } 或 auto pa=s.equal_range(1) for(auto it=pa.first;it!=pa.second;it++){ cout<< *it <<endl; } 4.11 multimap 允许key重复的map multimap<int,string> mm; 不可以使用mm[key] 因为key是可以重复的 auto pa = mm.equal_range(1) for(auto it==pa.first;it!=pa.second;it++){ cout<< it->first<<it->second.c_str() <<endl; } 4.12、 unordered_set 元素值唯一、无序的set 没有反向遍历reverse_iterator 4.13、unordered_map 元素索引唯一,无序的map 4.14 、unordered_nultiset 元素值不唯一, 无序的set 4.15、unordered_multimap 元素索引不唯一,无序的map