2.19c++练习
1.封装一个mystring类
拥有私有成员:
char* p
int len
需要让以下代码编译通过,并实现对应功能
mystring str = "hello"
mystring ptr;
ptr.copy(str)
ptr.append(str)
ptr.show() 输出ptr代表的字符串
ptr.compare(str) 比较ptr和str是否一样
ptr.swap(str) 交换ptr 和 str的内容
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>using namespace std;class mystring {
private:char* p; // 用来存储字符串的指针int len; // 字符串的长度public:// 构造函数mystring(const char* str = "") {len = strlen(str); // 获取字符串的长度p = new char[len + 1]; // 为字符串分配内存strcpy(p, str); // 复制传入的字符串cout << "构造函数" << endl;}// 析构函数~mystring() {delete[] p; // 释放动态分配的内存cout << "析构函数" << endl;}// 拷贝函数void copy(const char* str) {delete[] p; // 先释放当前字符串的内存len = strlen(str);p = new char[len + 1];strcpy(p, str); // 复制新的字符串}// 附加函数void m_append(const char* str) {char* temp = new char[len + strlen(str) + 1]; // 为新字符串分配内存strcpy(temp, p); // 复制原字符串strcat(temp, str); // 追加新字符串delete[] p; // 释放旧的内存p = temp; // 更新指针len += strlen(str); // 更新长度}// 输出函数void show() const {cout << p << endl;}// 比较函数bool compare(const char* str) const {return strcmp(p, str) == 0; // 比较字符串是否相等}// 交换内容void m_swap(mystring& other) {swap(p, other.p); // 交换指针swap(len, other.len); // 交换长度}
};int main() {mystring str("hello");mystring ptr;ptr.copy("world"); // 将 "world" 复制到 ptrptr.m_append("!!!"); // 追加 "!!!" 到 ptrptr.show(); // 输出 "world!!!"bool isEqual = ptr.compare("world!!!"); // 比较 ptr 和 "world!!!"cout << "Are they equal? " << (isEqual ? "Yes" : "No") << endl;ptr.m_swap(str); // 交换 str 和 ptr 的内容cout << "After swap:" << endl;str.show(); // 输出 "world!!!"ptr.show(); // 输出 "hello"return 0;
}
2.封装一个 File 类,用有私有成员
File* fp
实现以下功能
File f = "文件名" 要求打开该文件
f.write(string str) 要求将str数据写入文件中
string str = f.read(int size) 从文件中读取最多size个字节,并将读取到的数据返回
析构函数
#include <iostream>
#include <fstream>
#include <string>using namespace std;class File {
private:fstream* fp; // 文件指针string filename;public:// 构造函数,接受文件名并打开文件File(const string& fname) {filename = fname;fp = new fstream(filename, ios::in | ios::out | ios::app); // 读写模式,并追加内容if (!fp->is_open()) { // 如果文件不存在,则创建新文件fp->open(filename, ios::out); // 先创建文件fp->close();fp->open(filename, ios::in | ios::out | ios::app); // 重新以读写模式打开}cout << "文件 " << filename << " 打开成功!" << endl;}// 写入数据void write(const string& str) {if (fp && fp->is_open()) {*fp << str; // 写入字符串fp->flush(); // 立即写入文件}}// 读取数据string read(int size) {if (!fp || !fp->is_open()) {return "";}fp->seekg(0, ios::beg); // 重新定位到文件开头char* buffer = new char[size + 1]; // 分配缓冲区fp->read(buffer, size); // 读取 size 个字节int bytesRead = fp->gcount(); // 获取实际读取的字节数buffer[bytesRead] = '\0'; // 确保字符串终止string result(buffer); // 转换为字符串delete[] buffer; // 释放缓冲区return result;}// 析构函数,关闭文件~File() {if (fp) {fp->close();delete fp;cout << "文件 " << filename << " 已关闭!" << endl;}}
};// 测试代码
int main() {File f("test.txt"); // 打开文件 test.txtf.write("Hello, world!\n"); // 写入字符串string content = f.read(100); // 读取 100 字节cout << "读取到的内容:" << content << endl;return 0;
}
3.封装一个 Mutex 互斥锁类
要求:
构造函数:初始化互斥锁,并选择互斥锁的种类
lock 上锁互斥锁
unlock 解锁互斥锁
析构函数,销毁互斥锁并且开启一个线程测试该互斥锁
#include <iostream>
#include <thread>
#include <mutex>using namespace std;class Mutex {
private:mutex mtx; // 标准互斥锁public:// 构造函数:初始化互斥锁Mutex() {cout << "Mutex 初始化成功!" << endl;}// 加锁void lock() {mtx.lock();cout << "Mutex 已加锁" << endl;}// 解锁void unlock() {mtx.unlock();cout << "Mutex 已解锁" << endl;}// 析构函数:自动销毁~Mutex() {cout << "Mutex 已销毁" << endl;}
};// 共享资源
int shared_counter = 0;
Mutex myMutex;// 线程函数
void increment(int id) {for (int i = 0; i < 5; i++) {myMutex.lock();cout << "线程 " << id << " 访问共享资源" << endl;shared_counter++;cout << "当前 shared_counter 值:" << shared_counter << endl;myMutex.unlock();this_thread::sleep_for(chrono::milliseconds(100)); // 模拟耗时操作}
}int main() {// 创建两个线程thread t1(increment, 1);thread t2(increment, 2);// 等待线程完成t1.join();t2.join();cout << "最终 shared_counter 值:" << shared_counter << endl;return 0;
}
相关文章:
2.19c++练习
1.封装一个mystring类 拥有私有成员: char* p int len 需要让以下代码编译通过,并实现对应功能 mystring str "hello" mystring ptr; ptr.copy(str) ptr.append(str) ptr.show() 输出ptr代表的字符串 ptr.compare(str) 比较ptr和…...
【为什么使用`new DOMParser`可以保持SVG命名空间】
为什么使用new DOMParser可以保持SVG命名空间: 一、命名空间基础概念 1. XML命名空间定义 <svg xmlns"http://www.w3.org/2000/svg"><!-- 此元素及其子元素属于SVG命名空间 --><rect x"10" y"20"/> </svg>…...
【DL】浅谈深度学习中的知识蒸馏 | 输出层知识蒸馏
目录 一 核心概念与背景 二 输出层知识蒸馏 1 教师模型训练 2 软标签生成(Soft Targets) 3 学生模型训练 三 扩展 1 有效性分析 2 关键影响因素 3 变体 一 核心概念与背景 知识蒸馏(Knowledge Distillation, KD)是一种模…...
应急响应(linux 篇,以centos 7为例)
一、基础命令 1.查看已经登录的用户w 2.查看所有用户最近一次登录:lastlog 3.查看历史上登录的用户还有登录失败的用户 历史上所有登录成功的记录 last /var/log/wtmp 历史上所有登录失败的记录 Lastb /var/log/btmp 4.SSH登录日志 查看所有日志:…...
EasyRTC:智能硬件适配,实现多端音视频互动新突破
一、智能硬件全面支持,轻松跨越平台障碍 EasyRTC 采用前沿的智能硬件适配技术,无缝对接 Windows、macOS、Linux、Android、iOS 等主流操作系统,并全面拥抱 WebRTC 标准。这一特性确保了“一次开发,多端运行”的便捷性,…...
堆和栈的区别
堆和栈 不同点: 内存分配方式不同: 栈:栈上的内存是自动分配和释放的,通常用于存储函数调用过程中的局部变量、调用参数和使用的寄存器状态等信息。堆:堆上的内存是动态分配的,程序在运行时可以根据需要分…...
【信息系统项目管理师】专业英语重点词汇大汇总
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 一、信息和信息系统重要词汇汇总1.Computer(计算机)重要词汇2.Information system(信息系统)重要词汇3.Software Engineering(软件工程)重要词汇4.Network(网络)相关重要词汇5.信息安全重要词汇6.Electronic Co…...
CV -- YOLOv8 图像分割(GPU环境)
目录 参考视频: 标注 JSON转为TXT 训练 验证 参考视频: 使用 Yolov8 自定义数据集进行图像分割_哔哩哔哩_bilibili 标注 数据集: 我使用的是一些苹果数据集,可以在我的csdn资源中下载: https://download.csdn.net/do…...
Cherry-Studio下载安装教程,AI面向开发者的工具或平台(付安装包)
文章目录 一、Cherry Studio是什么?二、功能特点 一、Cherry Studio是什么? Cherry Studio 是一款开源跨平台的多模型服务桌面客户端,集成超 300 个大语言模型,内置 300 多个预配置 AI 助手,支持多格式文件处理、全局…...
【Javascript Day19】BOM
目录 BOM对象的方法 定时器方法 短信验证码案例 计时器元素动画 同步代码和异步代码 location对象 跳转查询页面参数 跳转多查询参数 BOM对象的方法 // window.alert("提示");// window 中提供的方法和属性,可以在省略window对象的情况下直接调用…...
git 操作 已经 commit 但是没有 push 怎么办
前言: 在操作commit后发现提交错了分支,直接切换分支是不行的,只能先取消commit的代码才能切换分支,因此记录一下git的操作 如果你已经执行了 git commit 但还没有进行 git push,可以通过以下几种方式撤回或修改提交…...
在 macOS 的 ARM 架构上按住 Command (⌘) + Shift + .(点)。这将暂时显示隐藏文件和文件夹。
在 macOS 的 ARM 架构(如 M1/M2 系列的 Mac)上,设置 Finder(访达)来显示隐藏文件夹的步骤如下: 使用快捷键临时显示隐藏文件: 在Finder中按住 Command (⌘) Shift .(点ÿ…...
【核心算法篇二十】《DeepSeek符号回归:让AI化身「数学神探」破解数据背后的宇宙公式》
“宇宙最不可理解之处,就是它居然可以被理解。”——爱因斯坦 如果让AI来续写这句话,或许会是:"数据最迷人的地方,在于它总能用数学公式讲出故事。"今天我们要聊的DeepSeek符号回归技术,就是教AI从杂乱数据中自动发现精妙数学规律的「黑魔法」。全程高能预警,建…...
如何在 Visual Studio Code 中使用 DeepSeek R1 和 Cline?
让我们面对现实吧:像 GitHub Copilot 这样的 AI 编码助手非常棒,但它们的订阅费用可能会在你的钱包里烧一个洞。进入 DeepSeek R1 — 一个免费的开源语言模型,在推理和编码任务方面可与 GPT-4 和 Claude 3.5 相媲美。将它与 Cline 配对&#…...
PHP旅游门票预订系统小程序源码
🌍 旅游门票预订系统:一站式畅游新体验,开启您的梦幻旅程 🌟 一款基于ThinkPHPUniapp精心雕琢的旅游门票预订系统,正翘首以待,为您揭开便捷、高效、全面的旅游预订新篇章!它超越了传统预订平台…...
在项目中调用本地Deepseek(接入本地Deepseek)
前言 之前发表的文章已经讲了如何本地部署Deepseek模型,并且如何给Deepseek模型投喂数据、搭建本地知识库,但大部分人不知道怎么应用,让自己的项目接入AI模型。 文末有彩蛋哦!!! 要接入本地部署的deepsee…...
notepad++右键菜单不见了
卸载时没点击完成,又重新安装了一个,最终导致了一些bug,导致右键没有notepad菜单。 解决方式: 新建一个register.reg文件,加入以下代码,然后双击执行即可 代码说明:Open with Notepad 是右…...
如何用ollama快速布署deepseek-r1大模型
deepseek在春节期间因为特朗普的一番发言而在中国已几乎人尽皆知,热度到了连90高寿的老父亲都向我推荐这个中国产的AI大模型,而且它是开源的!我试验了下,用ollama也可以快速度安装布署deepseek-r1大模型。本想写篇文章来介绍下dee…...
python-leetcode 36.二叉树的最大深度
题目: 给定一个二叉树root,返回其最大深度 二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数 方法一:深度优先搜索 知道了左子树和右子树的最大深度l和r,那么该二叉树的最大深度即为:max(l,r)1 而左子树和右子树的最大深…...
MySQL事务的特性和隔离级别
一、事务的特性 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作,即这些操作要么同时成功,要么同时失败 事务的有以下四个特性(acid)…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
