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

第 4 章 串(串的块链存储实现)

1. 背景说明

该实现和链表的实现极为相似,只是将链接的内存拆分为具体的大小的块。

2.  示例代码

1). status.h

/* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H
#define STATUS_H#define CHECK_NULL(pointer) if (!(pointer)) { \printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_NULL_PTR); \return NULL; \
}#define CHECK_RET(ret) if (ret != RET_OK) { \printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ret); \return ret; \
}#define CHECK_VALUE(value, ERR_CODE) if (value) { \printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_CODE); \return ERR_CODE; \
}#define CHECK_FALSE(value, ERR_CODE) if (!(value)) { \printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_CODE); \return FALSE; \
} /* 函数结果状态码 */
#define TRUE 					1			/* 返回值为真 */
#define FALSE 					0			/* 返回值为假 */
#define RET_OK 					0			/* 返回值正确 */
#define INFEASIABLE    		   	2			/* 返回值未知 */
#define ERR_MEMORY     		   	3			/* 访问内存错 */
#define ERR_NULL_PTR   			4			/* 空指针错误 */
#define ERR_MEMORY_ALLOCATE		5			/* 内存分配错 */
#define ERR_NULL_STACK			6			/* 栈元素为空 */
#define ERR_PARA				7			/* 函数参数错 */
#define ERR_OPEN_FILE			8			/* 打开文件错 */
#define ERR_NULL_QUEUE			9			/* 队列为空错 */
#define ERR_FULL_QUEUE			10			/* 队列为满错 */
#define ERR_NOT_FOUND			11			/* 表项不存在 */
typedef int Status;							/* Status 是函数的类型,其值是函数结果状态代码,如 RET_OK 等 */
typedef int Bollean;						/* Boolean 是布尔类型,其值是 TRUE 或 FALSE */#endif // !STATUS_H

2) lString.h

/* 串的块链存储实现头文件 */#ifndef LSTRING_H
#define LSTRING_H#include "status.h"#define CHUNK_SIZE 4
#define BLANK '#'typedef struct Chunk {char str[CHUNK_SIZE];struct Chunk *next;
} Chunk;typedef struct {Chunk *head, *tail;int curLen;				/* 字符个数 */
} LString;/* 初始化(产生空串)字符串 T */
Status InitString(LString *T);/* 生成一个其值等于 chars 的串 T (要求 chars 中不包含填补空余的字符)成功返回 OK,否则返回 ERROR */
Status StrAssign(const char *chars, LString *T);/* 初始条件: 串 S 存在操作结果: 由串 S 复制得串 T(连填补空余的字符一块拷贝) */
Status StrCopy(const LString *S, LString *T);/* 初始条件:串 S 存在操作结果:若 S 为空串,则返回 TRUE,否则返回 FALSE */
Bollean StrEmpty(const LString *S);/* 若 S > T,则返回值 > 0;若 S = T,则返回值 = 0;若 S < T, 则返回值 < 0 */
int StrCompare(const LString *S, const LString *T);/* 返回 S 的元素个数,称为串的长度 */
int StrLength(const LString *S);/* 初始条件: 串 S 存在操作结果: 将 S 清为空串 */
Status ClearString(LString *S);/* 用 T 返回由 S1 和 S2 联接而成的新串 */
Status Concat(const LString *S1, const LString *S2, LString *T);/* 用 Sub 返回串 S 的第 pos 个字符起长度为 len 的子串其中, 1≤ pos ≤ StrLength(S) 且 0 ≤ len ≤ StrLength(S) - pos + 1 */
Status SubString(const LString *S, int pos, int len, LString *Sub);/* T 为非空串。若主串 S 中第 pos 个字符之后存在与 T 相等的子串则返回第一个这样的子串在 S 中的位置,否则返回 0 */
int Index(const LString *S, const LString *T, int pos);/* 压缩串(清除块中不必要的填补空余的字符) */
Status Zip(LString *S);/* 1 ≤ pos ≤ StrLength(S) + 1。在串 S 的第 pos 个字符之前插入串 T */
Status StrInsert(const LString *T, int pos, LString *S);/* 从串 S 中删除第 pos 个字符起长度为 len 的子串 */
Status StrDelete(int pos, int len, LString *S);/* 初始条件: 串 S, T 和 V 存在,T 是非空串(此函数与串的存储结构无关)操作结果: 用 V 替换主串 S 中出现的所有与 T 相等的不重叠的子串 */
Status Replace(const LString *T, const LString *V, LString *S);/*  输出字符串 T */
void StrPrint(const LString *T);#endif // !LSTRING_H

3) lString.c

/* 串的块链存储实现源文件 */#include "lString.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>/* 初始化(产生空串)字符串 T */
Status InitString(LString *T)
{CHECK_VALUE(!T, ERR_NULL_PTR);T->curLen = 0;T->head = NULL;T->tail = NULL;return RET_OK;
}/* 生成一个其值等于 chars 的串 T (要求 chars 中不包含填补空余的字符)成功返回 OK,否则返回 ERROR */
Status StrAssign(const char *chars, LString *T)
{CHECK_VALUE(!chars || !T, ERR_NULL_PTR);int length = (int)strlen(chars);CHECK_VALUE((length == 0) || strchr(chars, BLANK), ERR_PARA);T->curLen = length;int nodes = length / CHUNK_SIZE;if (length % CHUNK_SIZE) {nodes += 1;}Chunk *tail = NULL, *newNode = NULL;for (int i = 0; i < nodes; ++i) {newNode = (Chunk *)malloc(sizeof(Chunk));CHECK_VALUE(!newNode, ERR_NULL_PTR);if (i == 0) {T->head = tail = newNode;} else {tail->next = newNode;tail = newNode;}int j;for (j = 0; (j < CHUNK_SIZE) && (*chars); ++j) {*(tail->str + j) = *chars++;}if (!(*chars)) {T->tail = tail;tail->next = NULL;while (j < CHUNK_SIZE) {*(tail->str + j++) = BLANK;}}}return RET_OK;
}/* 初始条件: 串 S 存在操作结果: 由串 S 复制得串 T(连填补空余的字符一块拷贝) */
Status StrCopy(const LString *S, LString *T)
{CHECK_VALUE(!S || !T, ERR_NULL_PTR);Chunk *sHead = S->head, *newNode = NULL;T->head = NULL;while (sHead) {newNode = (Chunk *)malloc(sizeof(Chunk));CHECK_VALUE(!newNode, ERR_MEMORY_ALLOCATE);newNode->next = NULL;(void)memcpy_s(newNode, sizeof(Chunk), sHead, sizeof(Chunk));if (T->head == NULL) {T->head = T->tail = newNode;} else {T->tail->next = newNode;T->tail = newNode;}sHead = sHead->next;}T->curLen = S->curLen;return RET_OK;
}/* 初始条件:串 S 存在操作结果:若 S 为空串,则返回 TRUE,否则返回 FALSE */
Bollean StrEmpty(const LString *S)
{CHECK_VALUE(!S, ERR_NULL_PTR);return (S->curLen == 0) ? TRUE : FALSE;
}static void GetNextCharPos(Chunk **node, int *order)
{++(*order);if (*order == CHUNK_SIZE) {*node = (*node)->next;*order = 0;}
}static void GetNextLegalCharPos(Chunk **node, int *order)
{while (*((*node)->str + *order) == BLANK) {GetNextCharPos(node, order);}
}/* 若 S > T,则返回值 > 0;若 S = T,则返回值 = 0;若 S < T, 则返回值 < 0 */
int StrCompare(const LString *S, const LString *T)
{CHECK_VALUE(!S || !T, ERR_NULL_PTR);Chunk *ps = S->head, *pt = T->head;for (int i = 0, js = 0, jt = 0; (i < S->curLen) && (i < T->curLen); ++i) {GetNextLegalCharPos(&ps, &js);GetNextLegalCharPos(&pt, &jt);if (*(ps->str + js) != *(pt->str + jt)) {return *(ps->str + js) - *(pt->str + jt);}GetNextCharPos(&ps, &js);GetNextCharPos(&pt, &jt);}return S->curLen - T->curLen;
}/* 返回 S 的元素个数,称为串的长度 */
int StrLength(const LString *S)
{CHECK_VALUE(!S, ERR_NULL_PTR);return S->curLen;
}/* 初始条件: 串 S 存在操作结果: 将 S 清为空串 */
Status ClearString(LString *S)
{CHECK_VALUE(!S, ERR_NULL_PTR);Chunk *p = S->head, *q = NULL;while (p) {q = p->next;free(p);p = q;}S->head = S->tail = NULL;S->curLen = 0;return RET_OK;
}/* 用 T 返回由 S1 和 S2 联接而成的新串 */
Status Concat(const LString *S1, const LString *S2, LString *T)
{CHECK_VALUE(!S1 || !S2 || !T, ERR_NULL_PTR);LString str1, str2;InitString(&str1);InitString(&str2);StrCopy(S1, &str1);StrCopy(S2, &str2);T->head = str1.head;str1.tail->next = str2.head;T->tail = str2.tail;T->curLen = str1.curLen + str2.curLen;return RET_OK;
}/* 用 Sub 返回串 S 的第 pos 个字符起长度为 len 的子串其中, 1≤ pos ≤ StrLength(S) 且 0 ≤ len ≤ StrLength(S) - pos + 1 */
Status SubString(const LString *S, int pos, int len, LString *Sub)
{CHECK_VALUE(!S || !Sub, ERR_NULL_PTR);CHECK_VALUE((pos < 1) || (pos > S->curLen) || (len < 0) || (len > (S->curLen - pos + 1)), ERR_PARA);int subLength = len / CHUNK_SIZE;if (len % CHUNK_SIZE) {subLength += 1;}Chunk *newNode = (Chunk *)malloc(sizeof(Chunk));Sub->head = newNode;Chunk *tail = Sub->head;for (int i = 0; i < subLength - 1; ++i) {newNode = (Chunk *)malloc(sizeof(Chunk));tail->next = newNode;tail = newNode;}tail->next = NULL;Sub->tail = tail;Sub->curLen = len;int lastPos = len % CHUNK_SIZE;if (lastPos) {for (int i = lastPos; i < CHUNK_SIZE; ++i) {*(newNode->str + i) = BLANK;}}Chunk *subHead = Sub->head, *sHead = S->head;int subPos = 0, count = 0;Bollean isEnd = FALSE;while (!isEnd) {for (int i = 0; i < CHUNK_SIZE; ++i) {if (*(sHead->str + i) == BLANK) {continue;}++count;if ((count >= pos) && (count <= pos + len - 1)) {if (subPos == CHUNK_SIZE) {subHead = subHead->next;subPos = 0;}*(subHead->str + subPos) = *(sHead->str + i);++subPos;if (count == pos + len - 1) {isEnd = TRUE;break;}}}sHead = sHead->next;}return RET_OK;
}/* T 为非空串。若主串 S 中第 pos 个字符之后存在与 T 相等的子串则返回第一个这样的子串在 S 中的位置,否则返回 0 */
int Index(const LString *S, const LString *T, int pos)
{CHECK_VALUE(!S || !T, ERR_NULL_PTR);int maxRange = StrLength(S) - StrLength(T) + 1;CHECK_VALUE((pos < 1) || (pos > maxRange), 0);LString sub;InitString(&sub);while (pos <= maxRange) {SubString(S, pos, StrLength(T), &sub);if (StrCompare(T, &sub) == 0) {return pos;}++pos;}return 0;
}/* 压缩串(清除块中不必要的填补空余的字符) */
Status Zip(LString *S)
{CHECK_VALUE(!S, ERR_NULL_PTR);char *newStr = (char *)malloc(sizeof(char) * (unsigned int)(S->curLen + 1));CHECK_VALUE(!newStr, ERR_NULL_PTR);Chunk *sHead = S->head;int count = 0;while (sHead) {for (int i = 0; i < CHUNK_SIZE; ++i) {if (*(sHead->str + i) != BLANK) {*(newStr + count) = *(sHead->str + i);++count;}}sHead = sHead->next;}*(newStr + count) = '\0';ClearString(S);StrAssign(newStr, S);return RET_OK;
}/* 1 ≤ pos ≤ StrLength(S) + 1。在串 S 的第 pos 个字符之前插入串 T */
Status StrInsert(const LString *T, int pos, LString *S)
{CHECK_VALUE(!T || !S, ERR_MEMORY_ALLOCATE);CHECK_VALUE((pos < 1) || (pos > StrLength(S) + 1), ERR_PARA);LString t;StrCopy(T, &t);Zip(S);int moveBlock = (pos - 1) / CHUNK_SIZE;int insertPos = (pos - 1) % CHUNK_SIZE;Chunk *sHead = S->head;if (pos == 1) {t.tail->next = S->head;S->head = t.head;} else if (insertPos == 0) {for (int i = 0; i < moveBlock - 1; ++i) {sHead = sHead->next;}Chunk *insertNext = sHead->next;sHead->next = t.head;t.tail->next = insertNext;if (insertNext == NULL) {S->tail = t.tail;}} else {for (int i = 0; i < moveBlock; ++i) {sHead = sHead->next;}Chunk *newBlock = (Chunk *)malloc(sizeof(Chunk));CHECK_VALUE(!newBlock, ERR_NULL_PTR);for (int i = 0; i < insertPos; ++i) {*(newBlock->str + i) = BLANK;}for (int i = insertPos; i < CHUNK_SIZE; ++i) {*(newBlock->str + i) = *(sHead->str + i);*(sHead->str + i) = BLANK;}newBlock->next = sHead->next;sHead->next = t.head;t.tail->next = newBlock;}S->curLen += t.curLen;Zip(S);return RET_OK;
}/* 从串 S 中删除第 pos 个字符起长度为 len 的子串 */
Status StrDelete(int pos, int len, LString *S)
{CHECK_VALUE(!S, ERR_NULL_PTR);CHECK_VALUE((pos < 1) || (pos > S->curLen - len + 1) || (len < 0), ERR_PARA);int count = 0;int currOrder = 0;Chunk *sHead = S->head;while (count < pos - 1) {GetNextLegalCharPos(&sHead, &currOrder);++count;GetNextCharPos(&sHead, &currOrder);}++count;if (*(sHead->str + currOrder) == BLANK) {GetNextLegalCharPos(&sHead, &currOrder);}while (count < pos + len) {GetNextLegalCharPos(&sHead, &currOrder);*(sHead->str + currOrder) = BLANK;++count;GetNextCharPos(&sHead, &currOrder);}S->curLen -= len;return RET_OK;
}/* 初始条件: 串 S, T 和 V 存在,T 是非空串(此函数与串的存储结构无关)操作结果: 用 V 替换主串 S 中出现的所有与 T 相等的不重叠的子串 */
Status Replace(const LString *T, const LString *V, LString *S)
{CHECK_VALUE(!T || !V || !S, ERR_NULL_PTR);CHECK_VALUE(StrEmpty(T), ERR_PARA);int pos = 1;do {pos = Index(S, T, pos);if (pos) {StrDelete(pos, StrLength(T), S);StrInsert(V, pos, S);pos += StrLength(V);}} while (pos);return RET_OK;
}/*  输出字符串 T */
void StrPrint(const LString *T)
{int count = 0;Chunk *tHead = T->head;while (count < T->curLen) {for (int i = 0; i < CHUNK_SIZE; ++i) {if (*(tHead->str + i) != BLANK) {printf("%c", *(tHead->str + i));++count;}}tHead = tHead->next;}
}

4) main.c

/* 入口程序源文件 */#include "lString.h"
#include <stdio.h>void ShowStr(const LString *S, const char *stringName);int main(void)
{LString t1, t2, t3, t4;InitString(&t1);InitString(&t2);InitString(&t3);InitString(&t4);printf("After initialize the string t1, the string t1 is %s,""the length of string t1 is %d\n", (StrEmpty(&t1) == TRUE) ? "empty" : "not empty",StrLength(&t1));char *s1 = "ABCDEFGHI", *s2 = "12345", *s3 = "", *s4 = "asd#tr", *s5 = "ABCD";Status ret = StrAssign(s3, &t1);if (ret == RET_OK) {ShowStr(&t1, "t1");}ret = StrAssign(s4, &t1);if (ret == RET_OK) {ShowStr(&t1, "t1");}ret = StrAssign(s1, &t1);if (ret == RET_OK) {ShowStr(&t1, "t1");}printf("After assign s1 to the string t1, the string t1 is %s,""the length of string t1 is %d\n", (StrEmpty(&t1) == TRUE) ? "empty" : "not empty",StrLength(&t1));ret = StrAssign(s2, &t2);if (ret == RET_OK) {ShowStr(&t2, "t2");}StrCopy(&t1, &t3);ShowStr(&t3, "t3");ret = StrAssign(s5, &t4);if (ret == RET_OK) {ShowStr(&t4, "t4");}Replace(&t4, &t2, &t3);ShowStr(&t3, "t3");ClearString(&t1);printf("After clear string t1, the string t1 is %s,""the length of string t1 is %d\n", (StrEmpty(&t1) == TRUE) ? "empty" : "not empty",StrLength(&t1));Concat(&t2, &t3, &t1);ShowStr(&t1, "t1");Zip(&t1);ShowStr(&t1, "t1");int pos = Index(&t1, &t3, 1);printf("pos = %d\n", pos);printf("To insert the string t2 before the posTh character of the string t1, enter pos: ");scanf_s("%d", &pos);StrInsert(&t2, pos, &t1);ShowStr(&t1, "t1");int len;printf("Please input the position and length of the subString of t1: ");scanf_s("%d%d", &pos, &len);ClearString(&t2);SubString(&t1, pos, len, &t2);ShowStr(&t2, "t2");printf("StrCompare(&t1, &t2) = %d\n", StrCompare(&t1, &t2));printf("Please input the position and length of the string t1 to be delete: ");scanf_s("%d%d", &pos, &len);StrDelete(pos, len, &t1);ShowStr(&t1, "t1");t1.head->str[0] = BLANK;t1.curLen--;printf("t1.head->str[0] = %c\n", t1.head->str[0]);ShowStr(&t1, "t1");Zip(&t1);printf("t1.head->str[0] = %c\n", t1.head->str[0]);ShowStr(&t1, "t1");ClearString(&t1);ClearString(&t2);ClearString(&t3);ClearString(&t4);return 0;
}void ShowStr(const LString *S, const char *stringName)
{printf("The string %s is: ", stringName);StrPrint(S);printf("\n");
}

3. 运行示例

相关文章:

第 4 章 串(串的块链存储实现)

1. 背景说明 该实现和链表的实现极为相似&#xff0c;只是将链接的内存拆分为具体的大小的块。 2. 示例代码 1). status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H#define CHECK_NULL(pointer) if (!(pointer)) { \printf("FuncN…...

Element表格之表头合并、单元格合并

一、合并表头 el-table配置 :header-cell-style"headFirst"headFirst({ row, colunm, rowIndex, columnIndex }) {let base { background-color: rgba(67, 137, 249, 0.3), color: #333, text-align: center };//这里为了是将第一列的表头隐藏&#xff0c;就形成了合…...

go学习-JS的encodeURIComponent转go

背景 encodeURIComponent() 函数通过将特定字符的每个实例替换成代表字符的 UTF-8 编码的一个、两个、三个或四个转义序列来编码 URI&#xff08;只有由两个“代理”字符组成的字符会被编码为四个转义序列&#xff09;。 与 encodeURI() 相比&#xff0c;此函数会编码更多的字…...

MySQL索引、事务与存储引擎

索引 事务 存储引擎 一、索引1.1 索引的概念1.2 索引的实现原理1.2 索引的作用1.3 创建索引的依据1.4 索引的分类和创建1.4.1 普通索引 index1.4.2 唯一索引 unique1.4.3 主键索引 primary key1.4.4 组合索引&#xff08;单列索引与多列索引&#xff09;1.4.5 全文索引 fulltex…...

【Spring面试】八、事务相关

文章目录 Q1、事务的四大特性是什么&#xff1f;Q2、Spring支持的事务管理类型有哪些&#xff1f;Spring事务实现方式有哪些&#xff1f;Q3、说一下Spring的事务传播行为Q4、说一下Spring的事务隔离Q5、Spring事务的实现原理Q6、Spring事务传播行为的实现原理是什么&#xff1f…...

Windows平台Qt6中UTF8与GBK文本编码互相转换、理解文本编码本质

快速答案 UTF8转GBK QString utf8_str"中UTF文"; std::string gbk_str(utf8_str.toLocal8Bit().data());GBK转UTF8 std::string gbk_str_given_by_somewhere"中GBK文"; QString utf8_strQString::fromLocal8Bit(gbk_str_given_by_somewhere.data());正文…...

【探索Linux】—— 强大的命令行工具 P.9(进程地址空间)

阅读导航 前言一、内存空间分布二、什么是进程地址空间1. 概念2. 进程地址空间的组成 三、进程地址空间的设计原理1. 基本原理2. 虚拟地址空间 概念 大小和范围 作用 虚拟地址空间的优点 3. 页表 四、为什么要有地址空间五、总结温馨提示 前言 前面我们讲了C语言的基础知识&am…...

ESP32主板-MoonESP32

产品简介 Moon-ESP32主板&#xff0c;一款以双核芯片ESP32-E为主芯片的主控板&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;低功耗&#xff0c;板载LED指示灯&#xff0c;引出所有IO端口&#xff0c;并提供多个I2C端口、SPI端口、串行端口&#xff0c;方便连接&#xff0c;…...

Python 图片处理笔记

import numpy as np import cv2 import os import matplotlib.pyplot as plt# 去除黑边框 def remove_the_blackborder(image):image cv2.imread(image) #读取图片img cv2.medianBlur(image, 5) #中值滤波&#xff0c;去除黑色边际中可能含有的噪声干扰#medianBlur( Inp…...

SpringCloud Ribbon--负载均衡 原理及应用实例

&#x1f600;前言 本篇博文是关于SpringCloud Ribbon的基本介绍&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力…...

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…...

ad18学习笔记十二:如何把同属性的元器件全部高亮?

1、先选择需要修改的器件的其中一个。 2、右键find similar objects&#xff0c;然后在弹出的对话框中&#xff0c;将要修改的属性后的any改为same 3、像这样勾选的话&#xff0c;能把同属性的元器件选中&#xff0c;其他器件颜色不变 注意了&#xff0c;如果这个时候&#xff…...

SpringSecurity 核心过滤器——SecurityContextPersistenceFilter

文章目录 前言过滤器介绍用户信息的存储获取用户信息存储用户信息获取用户信息 处理逻辑总结 前言 SecurityContextHolder&#xff0c;这个是一个非常基础的对象&#xff0c;存储了当前应用的上下文SecurityContext&#xff0c;而在SecurityContext可以获取Authentication对象…...

反转单链表

思路图1&#xff1a; 代码&#xff1a; struct ListNode* reverseList(struct ListNode* head){if(headNULL)//当head是空链表时 {return head; }struct ListNode* n1NULL;struct ListNode* n2head;struct ListNode* n3head->next;if(head->nextNULL)//当链表只有一个节…...

加速新药问世,药企如何利用云+网的优势?

随着计算能力的不断提高和人工智能技术的迅速发展&#xff0c;药物研发领域正迎来一场革命。云端强大的智能算法正成为药物研发企业的得力助手&#xff0c;推动着药物的精确设计和固相筛选。这使得药物设计、固相筛选以及药物制剂开发的时间大幅缩短&#xff0c;有望加速新药物…...

C++中string对象之间比较、char*之间比较

#include <cstring> //char* 使用strcmp #include <string> //string 使用compare #include <iostream> using namespace std; int main() {string stringStr1 "42";string stringStr2 "42";string stringStr3 "213";cout …...

MVVM模式理解

链接&#xff1a; MVVM框架理解及其原理实现 - 知乎 (zhihu.com) 重点&#xff1a; 1.将展示的界面窗口和创建的构件是数据进行分离 2.利用一个中间商进行数据的处理&#xff0c;所有的数据通过中间商进行处理...

js常用的数组处理方法

some 方法 用于检查数组中是否至少有一个元素满足指定条件。如果有满足条件的元素&#xff0c;返回值为 true&#xff0c;否则返回 false。 const numbers [1, 2, 3, 4, 5];const hasEvenNumber numbers.some((number) > number % 2 0); console.log(hasEvenNumber); /…...

[Document]VectoreStoreToDocument开发

该document是用来检索文档的。 第一步&#xff1a;定义组件对象&#xff0c;该组件返回有两种类型&#xff1a;document和text。 第二步&#xff1a;获取需要的信息&#xff0c;向量存储库&#xff0c;这里我使用的是内存向量存储&#xff08;用该组件拿到文档&#xff0c;并检…...

【LeetCode-简单题】225. 用队列实现栈

文章目录 题目方法一&#xff1a;单个队列实现 题目 方法一&#xff1a;单个队列实现 入栈 和入队正常进行出栈的元素其实就是队列的尾部元素&#xff0c;所以直接将尾部元素弹出即可&#xff0c;其实就可以将除了最后一个元素的其他元素出队再加入队&#xff0c;然后弹出队首元…...

数据预处理方式合集

删除空行 #del all None value data_all.dropna(axis1, howall, inplaceTrue) 删除空列 #del all None value data_all.dropna(axis0, howall, inplaceTrue) 缺失值处理 观测缺失值 观测数据缺失值有一个比较好用的工具包——missingno&#xff0c;直接传入DataFrame&…...

【前端】jquery获取data-*的属性值

通过jquery获取下面data-id的值 <div id"getId" data-id"122" >获取id</div> 方法一&#xff1a;dataset()方法 //data-前缀属性可以在JS中通过dataset取值&#xff0c;更加方便 console.log(getId.dataset.id);//112//赋值 getId.dataset.…...

GB28181学习(五)——实时视音频点播(信令传输部分)

要求 实时视音频点播的SIP消息应通过本域或其他域的SIP服务器进行路由、转发&#xff0c;目标设备的实时视音频流宜通过本域的媒体服务器进行转发&#xff1b;采用INVITE方法实现会话连接&#xff0c;采用RTP/RTCP协议实现媒体传输&#xff1b;信令流程分为客户端主动发起和第…...

单例模式(饿汉模式 懒汉模式)与一些特殊类设计

文章目录 一、不能被拷贝的类 二、只能在堆上创建类对象 三、只能在栈上创建类对象 四、不能被继承的类 五、单例模式 5、1 什么是单例模式 5、2 什么是设计模式 5、3 单例模式的实现 5、3、1 饿汉模式 5、3、1 懒汉模式 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x…...

133. 克隆图

133. 克隆图 题目-中等难度示例1. bfs 题目-中等难度 给你无向 连通 图中一个节点的引用&#xff0c;请你返回该图的 深拷贝&#xff08;克隆&#xff09;。 图中的每个节点都包含它的值 val&#xff08;int&#xff09; 和其邻居的列表&#xff08;list[Node]&#xff09;。…...

交流耐压试验目的

试验目的 交流耐压试验是鉴定电力设备绝缘强度最有效和最直接的方法。 电力设备在运行中&#xff0c; 绝缘长期受着电场、 温度和机械振动的作用会逐渐发生劣化&#xff0c; 其中包括整体劣化和部分劣化&#xff0c;形成缺陷&#xff0c; 例如由于局部地方电场比较集中或者局部…...

使用 YCSB 和 PE 进行 HBase 性能压力测试

HBase主要性能压力测试有两个&#xff0c;一个是 HBase 自带的 PE&#xff0c;另一个是 YCSB&#xff0c;先简单说一个两者的区别。PE 是 HBase 自带的工具&#xff0c;开箱即用&#xff0c;使用起来非常简单&#xff0c;但是 PE 只能按单个线程统计压测结果&#xff0c;不能汇…...

正则表达式相关概念及不可见高度页面的获取

12.正则 概念:匹配有规律的字符串,匹配上则正确 1.正则的创建方式 构造函数创建 // 修饰符 igm// i 忽视 ignore// g global 全球 全局// m 换行 var regnew RegExp("匹配的内容","修饰符")var str "this is a Box";var reg new RegExp(&qu…...

深入学习 Redis - 分布式锁底层实现原理,以及实际应用

目录 一、Redis 分布式锁 1.1、什么是分布式锁 1.2、分布式锁的基础实现 1.2.1、引入场景 1.2.2、基础实现思想 1.2.3、引入 setnx 1.3、引入过期时间 1.4、引入校验 id 1.5、引入 lua 脚本 1.5.1、引入 lua 脚本的原因 1.5.2、lua 脚本介绍 1.6、过期时间续约问题&…...

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…...

html5笑话网站源码/谷歌的推广是怎么样的推广

1&#xff1a;关系型数据库。 比如常见的 mysql、oracle、sqlserver 等&#xff0c;这类数据库基本上都支持 jdbc 或者 odbc 链接&#xff0c;所以报表工具基本上都支持。 2&#xff1a;文本文件 常见的 txt、csv、excel 等文本文件&#xff0c;这类文本文件就看各类报表的支…...

长沙建网站设计/做销售记住这十句口诀

2019独角兽企业重金招聘Python工程师标准>>> package com.dir;/**编号1,2, ... n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人出列&#xff0c;它的下一个人从1依次报数&#xff0c;数到m的人又出列&#xff0c;直到…...

wordpress站点标题图片/免费网站制作软件平台

本来一直反对在sql server中使用clr的&#xff0c;但是无奈在我之前&#xff0c;网站已经被人开启clr&#xff0c;所以今天干脆偶也来实现一个clr的trigger&#xff0c;用于在文章表内建立一个insert 触发器&#xff0c;每次发表文章&#xff0c;均ping一次google的博客接口。 …...

营销型网站的三元素/seo关键词优化方法

将以下代码复制粘贴到txt文件中&#xff0c;另存为bat格式&#xff0c;并将文件编码格式修改为ANSI&#xff0c;跟要处理的文件放一个文件夹内运行。 代码中制定的是删除1,2行&#xff0c;可根据需求自行修改。 echo off rem 根据指定的行号范围删除多个txt文件里的连续多行内…...

wordpress 动态背景/模板之家

给出一个二维的字母板和一个单词&#xff0c;寻找字母板网格中是否存在这个单词。 单词可以由按顺序的相邻单元的字母组成&#xff0c;其中相邻单元指的是水平或者垂直方向相邻。每个单元中的字母最多只能使用一次。 样例 给出board [ “ABCE”, “SFCS”, “ADEE” ]…...

云服务器可以做两个网站吗/北京做网站公司哪家好

这是悦乐书的第316次更新&#xff0c;第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题&#xff08;顺位题号是788&#xff09;。如果一个数字经过180度旋转后&#xff0c;变成了一个与原数字不同的数&#xff0c;这样的数被称为好数字。数字中的每一…...