string(三)--实现
大家看了这么久的string了,可能对string的简单实现有兴趣,所以我实现了一个string类的常用接口,大家可以自行查看:
我是分多文件写的:
string.h:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
#include <string.h>
#include <assert.h>namespace cx
{class string{public://构造函数:string(const char* str = "");//默认值声明时写--string()string(const string& s); string(size_t n, char c);string(const char* s, size_t n);string(const string& str, size_t pos, size_t len = npos);//运算符重载构造string& operator= (const char* s); string& operator= (char c); //string& operator=(const string& s);string& operator=(const string s);//析构函数~string();//迭代器部分:typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _str;}const_iterator begin() const{return _str;}iterator end(){return _str+_size;}const_iterator end() const{return _str + _size;}iterator rbegin(){return end();}const_iterator rbegin() const{return end();}iterator rend(){return begin();}const_iterator rend() const{return begin();}//capacity:inline size_t size()const{return _size;}inline size_t length()const{return _size;}inline size_t capacity()const{return _capacity;}inline bool empty()const{return _size == 0;}void reserve(size_t n = 0);inline size_t max_size() const{return -1;}void clear(); //modify:string& operator+= (const string& str);string & operator+= (const char* s);string& operator+= (char c);void push_back(char c);string& append(const string& str);string& append(const string& str, size_t subpos, size_t sublen);string & append(const char* s);string& append(const char* s, size_t n);string& append(size_t n, char c);string& erase(size_t pos = 0, size_t len = npos);void swap(string& str);void pop_back();string& replace(size_t pos, size_t len, const string& str);string& replace(size_t pos, size_t len, const char* s);// const char* c_str()const;//access:char& operator[] (size_t pos);const char& operator[] (size_t pos) const;char& at(size_t pos);const char& at(size_t pos) const;//String operations :size_t find(const string& str, size_t pos = 0) const;size_t find(const char* s, size_t pos = 0) const;size_t find(const char* s, size_t pos, size_t n) const;size_t find(char c, size_t pos = 0) const;string substr(size_t pos = 0, size_t len = npos) const;//Non - member function overloads: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);//友元部分:friend ostream& operator<<(ostream& _cout, const cx::string& s); friend istream& operator>>(istream& _cin, cx::string& s);private:const static size_t npos=-1;//特殊用法//static size_t npos;char* _str=nullptr;//缺省值size_t _size=0;//缺省值size_t _capacity=0;//缺省值};
};
//static正常用法
//size_t npos = -1;
string.cpp:
#include "string.h"
//构造函数:
cx::string::string(const char* str)//默认值处理空串
{//不适合列表初始化,原因在于strlen时间复杂度O(N)_size = strlen(str);_capacity = _size;char* tmp = new char[_size + 1];//new不用检查strcpy(tmp, str);tmp[_size] = '\0';delete[] _str;_str = tmp;
}
//传统写法:
//cx::string::string(const string& s)
//{
// char* tmp = new char[s.size() + 1];
// strcpy(tmp, s._str);
// tmp[s.size()] = '\0';
// delete[] _str;
// _str = tmp;
// _capacity = s._capacity;
// _size = s._size;
//}
//现代写法;
cx::string::string(const string& s)
{cx::string tmp(s._str);//拷贝一份临时变量swap(tmp);//将*this和tmp交换//注意点,this初始化情况,我们在private处给缺省值
}
cx::string::string(size_t n, char c)
{char* tmp = new char[n + 1];//strcpy(_str, 0);_size = n;_capacity = n;for (int i = 0; i < n; i++){tmp[i] = c;}tmp[_size] = '\0';delete[] _str;_str = tmp;
}
cx::string::string(const char* s, size_t n)
{char* tmp = new char[n + 1];strncpy(tmp, s, n);tmp[n] = '\0';delete[] _str;_str = tmp;_size = _capacity = n;
}
cx::string::string(const string& str, size_t pos, size_t len)
{if (len == npos || pos + len > str._size){char* tmp = new char[str.size() - pos + 1];_capacity = str.size() - pos;strncpy(tmp, str._str + pos, len);delete[] _str;_str = tmp;}else{char* tmp = new char[len + 1];_capacity = len;strncpy(tmp, str._str + pos, len);delete[] _str;_str = tmp;}_size = len;_str[_size] = '\0';
}
//运算符重载构造
cx::string& cx::string::operator= (const char* s)
{_capacity = _size = strlen(s);char* tmp = new char[_size + 1];strcpy(tmp, s);tmp[_size] = '\0';delete[] _str;_str = tmp;return *this;
}
cx::string& cx::string::operator= (char c)
{char* tmp = new char[2];tmp[0] = c;_size = _capacity = 1;tmp[_size] = '\0';delete[] _str;_str = tmp;return *this;
}
//传统写法:
//cx::string& cx::string::operator=(const string& s)
//{
// if (this != &s)
// {
// char* tmp = new char[s._capacity + 1];
// strcpy(tmp, s._str);
// tmp[s._capacity] = '\0';
// delete[] _str;
// _str = tmp;
// _size = s._size;
// _capacity = s._capacity;
// }
// return *this;
//}
//现代写法:
cx::string& cx::string::operator=(string s)
{swap(s);//将this和s交换return *this;
}
//析构函数
cx::string::~string()
{delete[] _str;_str = nullptr;_size = _capacity = 0;
}//capacity:
void cx::string::reserve(size_t n)
{if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str); delete[] _str;_str = tmp;_capacity = n;}
}
void cx::string::clear()
{erase();
}
void cx::string::swap(string& str)
{std::swap(_str, str._str);std::swap(_size,str._size);std::swap(_capacity , str._capacity);
}
void cx::string::pop_back()
{erase(_size - 1, 1);
}
cx::string& cx::string::replace(size_t pos, size_t len, const string& str)
{//检查if (pos + len > _size){reserve(pos + len);strncpy(_str + pos, str._str, len);_size = pos + len;_str[_size] = '\0';}else{strncpy(_str + pos, str._str, len);_size = pos + len;}return *this;
}
cx::string& cx::string::replace(size_t pos, size_t len, const char* s)
{//检查if (pos + len > _size){reserve(pos + len);strncpy(_str + pos, s, len);_size = pos + len;_str[_size] = '\0';}else{strncpy(_str + pos, s, len);_size = pos + len;}return *this;
}//modify:
cx::string& cx::string::operator+= (const cx::string& str)
{append(str);return *this;
}
cx::string& cx::string::operator+= (const char* s)
{append(s);return *this;
}
cx::string& cx::string::operator+= (char c)
{push_back(c);return *this;
}
void cx::string::push_back(char c)
{if (_capacity == _size){size_t newcapacity = _capacity == 0 ? 4 : 2 * _capacity;reserve(newcapacity);}_str[_size++] = c;_str[_size] = '\0';
}
cx::string& cx::string::append(const string& str)
{if (str._size + _size > _capacity){reserve(str._size + _size);}strcpy(_str + _size, str._str);_size += str._size;_str[_size] = '\0';return *this;
}
cx::string& cx::string::append(const char* s)
{size_t len = strlen(s);if (len + _size > _capacity){reserve(_size + len);}strcpy(_str + _size, s);_size += len;_str[_size] = '\0';return *this;
}
cx::string& cx::string::append(size_t n, char c)
{//检查if (n + _size > _capacity){reserve(n + _size);}for (size_t i = _size; i < _size + n; i++){_str[i] = c;}_size += n;_str[_size] = '\0';return *this;
}
cx::string& cx::string::append(const char* s, size_t n)
{//检查if (n + _size > _capacity){reserve(n + _size);}strncpy(_str+_size, s, n);_size += n;_str[_size] = '\0';return *this;
}
cx::string& cx::string::append(const string& str, size_t subpos, size_t sublen)
{//检查if (sublen + _size > _capacity){reserve(sublen + _size);}strncpy(_str+_size, str._str+subpos, sublen);_size += sublen;_str[_size] = '\0';return *this;
}
cx::string& cx::string::erase(size_t pos, size_t len)
{ assert(pos <= _size);if (len == npos || len + pos > _size){_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;_str[_size] = '\0';}return *this;
}//access:
char& cx::string::operator[] (size_t pos)
{assert(pos <= _size);return *(_str + pos);//等价于_str[pos]
}
const char& cx::string::operator[] (size_t pos) const
{assert(pos <= _size);return *(_str + pos);//等价于_str[pos]
}
char& cx::string::at(size_t pos)
{assert(pos < _size);return _str[pos];
}
const char& cx::string::at(size_t pos) const
{assert(pos < _size);return _str[pos];
}//String operations :
size_t cx::string::find(const string& str, size_t pos ) const
{char* tmp = new char[str._size + 1];strcpy(tmp, str._str);tmp[str._size ] = '\0';const char* ptr = strstr(_str + pos, tmp);if (ptr == nullptr){delete[] tmp;tmp = nullptr;return npos;}else{delete[] tmp;tmp = nullptr;return ptr - _str;}
}
size_t cx::string::find(const char* s, size_t pos ) const
{const char* ptr = strstr(_str + pos, s);if (ptr == nullptr){return npos;}else{return ptr - _str;}
}
size_t cx::string::find(const char* s, size_t pos, size_t n) const
{char* tmp = new char[n];strcpy(tmp, s);tmp[n] = '\0';const char* ptr = strstr(_str + pos, tmp);if (ptr == nullptr){delete[] tmp;tmp = nullptr;return npos;}else{delete[] tmp;tmp = nullptr;return ptr - _str;}
}
size_t cx::string::find(char c, size_t pos ) const
{for (size_t i = pos; i < _size; i++){if (_str[i] == c)return i;}return npos;
}
cx::string cx::string::substr(size_t pos , size_t len) const
{//检查:assert(pos < _size);size_t end = pos + len;if (len == npos || pos + len >= _size){end = _size;}string str;str.reserve(end - pos);for (size_t i = pos; i < end; i++){str += _str[i];}return str;
}//Non - member function overloads:
bool cx::string::operator<(const string& s)
{size_t n = _size > s._size ? s._size : _size;for (size_t i = 0; i < n; i++){if (_str[i] >= s._str[i])return false;}if (n == s._size)return false;elsereturn true;
}
bool cx::string::operator<=(const string& s)
{return !(*this > s);
}
bool cx::string::operator>(const string& s)
{return !((*this == s) || (*this < s));
}
bool cx::string::operator>=(const string& s)
{return !(*this < s);
}
bool cx::string::operator==(const string& s)
{if (_size != s._size)return false;for (size_t i = 0; i < _size; i++){if (_str[i] != s._str[i])return false;}return true;
}
bool cx::string::operator!=(const string& s)
{return !(*this == s);
}//友元:
// 写法一:
//namespace cx
//{
// ostream& operator<<(ostream& _cout, const cx::string& s)
// {
// for (auto e : s)
// {
// _cout << e;
// }
// return _cout;
// }
//}
//写法二:
ostream& cx::operator<<(ostream& _cout, const cx::string& s)
{for (auto e : s){_cout << e;}return _cout;
}
istream& cx::operator>>(istream& _cin, cx::string& s)
{s.clear();//清除内容char ch = _cin.get();//建立一个缓冲数组char buff[64];size_t i = 0;while((ch != ' ') && (ch != '\n')){//读入buff中buff[i++] = ch;if (65 == i){buff[i] = '\0';//注意:置零s += buff;//利用operator+=数组i = 0;}ch = _cin.get();}if (i > 0){buff[i] = '\0';s += buff;}return _cin;
}
test.cpp:
#include "string.h"
void test_string()
{cx::string s0("Initial string");std::cout << s0 << std::endl;cx::string s1;std::cout << s1 << std::endl;cx::string s2(s0);std::cout << s2 << std::endl;cx::string s3(s0, 8, 3);std::cout << s3 << std::endl;cx::string s4("A character sequence");std::cout << s4 << std::endl;cx::string s5("Another character sequence", 12);std::cout << s5 << std::endl;cx::string s6(10, 'x');std::cout << s6 << std::endl;cx::string s7(10, 42);std::cout << s7 << std::endl;
}
void test_operator()
{cx::string str("Test string");for (int i = 0; i < str.size(); ++i){std::cout << str[i] << std::endl;}for (int i = 0; i < str.length(); ++i){std::cout << str[i] << std::endl;}
}
void test_capacity()
{cx::string str("Test string");std::cout << str.max_size() << std::endl;std::cout << str.capacity() << std::endl;
}
void test_reserve()
{cx::string str("Test string");std::cout << str.empty() << std::endl;std::cout << str.capacity() << std::endl;str.reserve(50);std::cout << str.capacity() << std::endl;
}
void _string2()
{cx::string s0("Initial string");cout << s0 << std::endl;cx::string s1;cout << s1 << std::endl;cx::string s2(s0);cout << s2 << std::endl;cx::string s3(s0, 8, 3);cout << s3 << std::endl;cx::string s4("A character sequence");cout << s4 << std::endl;cx::string s5("Another character sequence", 12);cout << s5 << std::endl;cx::string s6(10, 'x');cout << s6 << std::endl;cx::string s7(10, 42);cout << s7 << std::endl;
}
void test_s()
{cx::string s0("Initial string");cx::string s3(s0, 8, 3);cout << s3 << std::endl;
}
void test_opertaor()
{cx::string s1 = "hello world";cx::string s2 = "c";cx::string s3 = s1;cout << s1 << std::endl;cout << s2 << std::endl;cout << s3 << std::endl;
}
void test_o()
{cx::string str1, str2, str3;str1 = "Test string: "; // c-stringstr2 = 'x'; // single character//str3 = str1 + str2; // stringcout << str1 << std::endl;cout << str2 << std::endl;
}
void test_push()
{cx::string s1 = "hello worl";s1.push_back('d');cout << s1 << std::endl;
}
void test_append()
{cx::string str;cx::string str2 = "Writing ";cx::string str3 = "print 10 and then 5 more";str.append(str2);// "Writing "cout << str << std::endl;str.append(str3, 6, 3);// "10 "cout << str << std::endl;str.append("dots are cool", 5);// "dots "cout << str << std::endl;str.append("here: ");// "here: "cout << str << std::endl;str.append(10u, '.'); // ".........."cout << str << std::endl;
}
void test_oper()
{cx::string name("John");cx::string family("Smith");name += " K. ";cout << name << std::endl;name += family;cout << name << std::endl;name += '\n';cout << name << std::endl;
}
void erase_test()
{cx::string s1 = "hello world";cout << s1.size() << std::endl;cout << s1.capacity() << std::endl;cout << s1 << endl;s1.clear();cout << s1.size() << std::endl;cout << s1.capacity() << std::endl;cout << s1 << endl;
}
void test_cin()
{cx::string s1, s2;cin >> s1;cout << s1 << endl;cin >> s2;s1 += s2;cout << s1 << endl;
}
void test_stringc()
{cx::string s1 = "helloworld";cx::string s2(s1);cout << s2 << endl;
}
void test_op()
{cx::string s1 = "hello world",s2;s2 = s1;cout << s2 << endl;
}
int main()
{test_stringc();return 0;
}
最后,感谢大家的支持!!!
相关文章:
string(三)--实现
大家看了这么久的string了,可能对string的简单实现有兴趣,所以我实现了一个string类的常用接口,大家可以自行查看: 我是分多文件写的: string.h: #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <ios…...
textbox跨线程写入
实现实例1 实现效果 跨线程实现 // 委托,用于定义在UI线程上执行的方法签名 //public delegate void SetTextCallback(string text);public void textBoxText(string text){// 检查调用线程是否是创建控件的线程 if (textBox1.InvokeRequired){// 如果不是&#…...
幻兽帕鲁专用服务器搭建之Linux部署配置教程
大家好我是飞飞,上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求,很多小伙伴就寻思用Linux系统搭建占用会不会小一点?有计算机基础的小伙伴都知道Linux系统和Windows系统相比,…...
Kubernetes: 本地部署dashboard
本篇文章主要是介绍如何在本地部署kubernetes dashboard, 部署环境是mac m2 下载dashboard.yaml 官网release地址: kubernetes/dashboard/releases 本篇文章下载的是kubernetes-dashboard-v2.7.0的版本,通过wget命令下载到本地: wget https://raw.githubusercont…...
Outlook邮箱IMAP密码怎么填写?账户设置?
Outlook邮箱IMAP密码是什么?Outlook如何设置IMAP? 许多用户会选择通过IMAP协议将邮箱与各种邮件客户端进行连接。而在设置过程中,填写IMAP密码是必不可少的一步。那么,Outlook邮箱的IMAP密码应该如何填写呢?接下来&am…...
[计算机网络]--I/O多路转接之poll和epoll
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、poll函…...
【NTN 卫星通信】卫星和无人机配合的应用场景
1 场景概述 卫星接入网是一种有潜力的技术,可以为地面覆盖差地区的用户提供无处不在的网络服务。然而,卫星覆盖范围对于位于考古或采矿地点内部/被茂密森林覆盖的村庄/山谷/靠近山丘或大型建筑物的用户可能很稀疏。因此,涉及卫星接入和无人驾…...
Git 分布式版本控制系统
Git是一个分布式版本控制系统,可以记录项目文件的变动并管理项目的不同版本。以下是Git的基本概念和使用方式: 仓库(Repository):Git用仓库来存储项目文件。仓库可以是本地仓库,也可以是远程仓库࿰…...
ng : 无法将ng项识别为 cmdlet、函数、脚本文件或可运行程序的名称
ng : 无法将“ng”项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,出现这种错误,那说明你angular-cli没有下载所以环境变量里没有相应的东西 1、需要在cmd里输入npm install -g angular/cli 2、之后运行angular命令时还可能出现这种错误 “ng : …...
iOS小技能:苹果书签打包教程【WebClip描述文件(WebClip Configuration Profile)】
文章目录 引言I WebClip描述文件1.1 属性说明1.2 利用Apple Configurator 2生成描述文件II 部署方式和签名2.1 对 .mobileconfig 文件进行签名2.2 部署方式引言 WebClip描述文件(WebClip Configuration Profile)是一种用于iOS设备的简易配置文件,它可以在你的iOS设备(如iP…...
Spring Cloud项目合规性注册之-(单元集成测试报告)
用于合规性注册,本文章仅提供模板 这个大纲涵盖了从单元测试到集成测试,再到自动化和持续集成的全方位测试过程。 一、引言 1. 项目概述 "xxxxxx"是一个先进的数据管理和展示平台,旨在提供高效、可靠的数据服务。该平台通过集成各…...
IntelliJ IDEA 常用的插件
IntelliJ IDEA有很多常用的插件,这些插件可以扩展IDE的功能,提高开发效率。以下是一些常用的插件: Maven Helper:这是一款分析Maven依赖冲突的插件。在没有此插件时,查看Maven的依赖树和检查依赖包冲突可能需要输入命…...
超详细红黑树的模拟实现
前言 有人说设计出AVL树的的人是个大牛,那写红黑树(RBTree)的人就是天才! 上一篇文章,我们已经学习了AVL树,牛牛个人认为AVL树已经够优秀了,那让我们一起探究一下,为什么红黑树比AV…...
【亚马逊云科技】通过Amazon CloudFront(CDN)快速访问资源
文章目录 前言一、应用场景二、【亚马逊云科技】CloudFront(CDN)的优势三、入门使用总结 前言 前面有篇文章我们介绍了亚马逊云科技的云存储服务。云存储服务主要用于托管资源,而本篇文章要介绍的CDN则是一种对托管资源的快速访问服务&#…...
ES-ES的基本概念
ES的基本概念 一、文档 1.1 文档相关概念 ES是面向文档的,文档是所有可搜索数据的最小单位,可以对比理解为关系型数据库中的一条数据 日志文件中的一条日志信息一本电影的具体信息/一张唱片的详细信息 文档会被序列化成JSON格式保存在ES中 JSON对象由…...
排序算法——快速排序的非递归写法
快速排序的非递归 我们写快速排序的时候,通常用的递归的方法实现快速排序,那么有没有非递归的方法实现快速排序呢?肯定是有的。思想还是一样的,不过非递归是看似是非递归其实还是递归。 思路解释 快速排序的非递归使用的是栈这…...
【论文阅读】基于人工智能目标检测与跟踪技术的过冷流沸腾气泡特征提取
Bubble feature extraction in subcooled flow boiling using AI-based object detection and tracking techniques 基于人工智能目标检测与跟踪技术的过冷流沸腾气泡特征提取 期刊信息:International Journal of Heat and Mass Transfer 2024 级别:EI检…...
RabbitMQ讲解与整合
RabbitMq安装 类型概念 租户 RabbitMQ 中有一个概念叫做多租户,每一个 RabbitMQ 服务器都能创建出许多虚拟的消息服务器,这些虚拟的消息服务器就是我们所说的虚拟主机(virtual host),一般简称为 vhost。 每一个 vhos…...
python 基础知识点(蓝桥杯python科目个人复习计划56)
今日复习内容:做题 例题1:最小的或运算 问题描述:给定整数a,b,求最小的整数x,满足a|x b|x,其中|表示或运算。 输入格式: 第一行包括两个正整数a,b; 输出格式&#…...
【vue】vue中数据双向绑定原理/响应式原理,mvvm,mvc、mvp分别是什么
关于 vue 的原理主要有两个重要内容,分别是 mvvm 数据双向绑定原理,和 响应式原理 MVC(Model-View-Controller): Model(模型):表示应用程序的数据和业务逻辑。View(视图&…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
