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

C++随心记

C++随心记

C++中的 CONST

C++中的const是表示不可修改

int main()
{/* 对于变量而言 */// 不可修改的常量const int A = 10;// 不可修改的指针指向const int* pointer_0 = nullptr;int const* poniter_1 = nullptr;// 不可修改指针指向的内容int* const poniter_2 = nullptr;
}

const也可修饰函数

class Entity
{
private:int* pointer;int x;
public:/* 对于函数而言 */// 修饰函数,使得其权限仅为读取,不可写入int GetX() const{// x++; 此语句是非法的,函数被const修饰后不准更改函数外的变量return x;}// 如果返回的为指针也可以用于修饰指针// 指向内容不可变int* const GetPoniter(){return pointer;}// 指向不可变const int* GetPointer(){return pointer;}// 一次性写最多的合法constconst int* const GetPointer() const{return pointer;}};

C++中的mutable

和上文的const一样,都是关键字,但mutable与const相反。mutable意味着可更改的。

class Entity
{
private:mutable int x;int y;
public:Entity(): x(10), y(20){}void ChangeXAndRead() const{x++;std::cout << "The value of X,Y is " << x << ',' << y << std::endl;// 这里的输出结果为11,20// 当试图修改y的值的时候,因为y的值为非mutable修饰,所以会报错}
};

C++中的成员初始化列表

在面向对象的语言中,多数程序员喜欢在构造器内初始化成员。在C++语法中,存在专门初始化成员的功能,此功能的优点是:避免了在定义成员时被构造,当我们定义一个变量时,如果这个变量为某个类的实例,那么在定义时会调用其构造器,当我们赋值时回再次调用构造器,这造成了性能的浪费。

class Entity
{
public:std::string x;  // 此时调用了string的构造器Entity(){x = "Hello";    // 此时调用了"Hello"的构造器,并把地址给了x}
};// 下面是一个比较直观的例子
class Example
{
public:Exapmle(){std::cout << "Example created!" << std::endl; }Example(int x){std::cout << "Example created with x! x=" << x << std::endl; }
};class Entity
{
public:Example example;// 这里会输出Example created!Entity(){example = Example(8);// 这里会输出Example created with x! x=8}
};

这样就输出了两次,代表着调用了两次构造器。为了节省性能,我们可以使用成员初始化列表,语法如下

class Entity
{
private:std::string m_Name;int m_DebugCount;
public:Entity(const std::string& Name):m_Name(Name), m_DebugCount(0){}
};

上面写了一个有参构造器,参变量为常量引用的Name。重点是下面是成员初始化列表,用冒号隔开,冒号后为要初始化的成员,初始化的内容为后面的括号的内容。需要注意的是,成员初始化列表需要和成员变量的定义顺序相同,这一规则非严格规定,但不遵守此规则可能会导致部分成员变量无法初始化!每个成员变量之间用逗号隔开

delete的小注意

对于new出来的对象,要记得delete。要delete一块数组,要用delete[]

int main()
{int* a = new int[10];delete[] a; // To delete array areturn 0;
}

如果不使用delete[]的话,你删的只是指针所指的第一个元素而已。

C++的隐式类型转换

C++中的类型转换是自动的,甚至可以转换到类的构造器中,以下为实例。

class Entity
{
private:int m_Age;std::string m_Name;
public:Entity(const std::string& name):m_Age(-1), m_Name(name){std::cout << "Entity constructor with name has called!" << std::endl;}Entity(int age):m_Age(age), m_Name("Unknown"){std::cout << "Entity constructor with age has called!" << std::endl;}
};int main()
{Entity e1 = 12; // 隐式类型转换Entity e2 = std::string("Chreno");return 0;
}

explicit关键字

由于隐式转换是默认的,开发者不希望自己的构造函数被隐式转换就可以添加关键字explicit来强制构造器拒绝隐式转换。例如

class Entity
{
private:int m_Age;std::string m_Name;
public:Entity(const std::string& name):m_Age(-1), m_Name(name){std::cout << "Entity constructor with name has called!" << std::endl;}explicit Entity(int age):m_Age(age), m_Name("Unknown"){std::cout << "Entity constructor with age has called!" << std::endl;}
};int main()
{// Entity e1 = 12; // 此行由于构造器被explicit修饰故报错Entity e2 = std::string("Chreno");return 0;
}

C++中的运算符重载

浅谈一下重载问题,其实运算符最简单的四则运算无非就是加减乘除。我们在重载时只要跟编译器说明了这个函数就是在重载就好了,我们会用到operator标识一下我们重载的是运算符

struct Vector2
{float x, y;Vector2(float x, float y):x(x), y(y) {}// 运算符重载Vector2 operator+(const Vector2& other) const{return Vector2(x + other.x, y + other.y);}Vector2 operator-(const Vector2& other) const{return Vector2(x - other.x, y - other.y);}Vector2 operator*(const Vector2& other) const{return Vector2(x * other.x, y * other.y);}Vector2 operator/(const Vector2& other) const{return Vector2(x / other.x, y / other.y);}Vector2 Add(const Vector2& other) const{return Vector2(x + other.x, y + other.y);}Vector2 Multiply(const Vector2& other) const{return Vector2(x * other.x, y * other.y);}void printSelf(){std::cout << "Value of x:" << x << ",Value of y:" << y << std::endl;}
};int main()
{Vector2 position(4.0f, 4.0f);Vector2 speed(0.5f, 1.5f);Vector2 powerup(1.1f, 1.1f);Vector2 result = position.Add(speed.Multiply(powerup));Vector2 res = position + speed * powerup;result.printSelf();res.printSelf();// result equals resreturn 0;
}

再补充一点,我们可以重载ostream的<<运算符来达到输出内容的目的

#include <iostream>class Entity
{
public:int x, y;Entity(int x, int y):x(x), y(y){}};// 2、此时我们就需要重载一下运算符
std::ostream& operator<<(std::ostream& stream, const Entity& other)
{stream << other.x << ',' << other.y << std::endl;return stream;
}int main()
{Entity e(1, 2);// std::cout << e << std::endl; // 1、这里肯定不会输出其内容,而且也会报错// 3、然后我们再来使用这个运算符std::cout << e << std::endl;return 0;
}

C++智能指针

智能指针就是用std::unique_ptr<>来裹住一个对象,相对于原始指针,智能指针加了一层壳。将这个对象的栈和堆内存绑定,在跳出作用域时自动调用delete方法,语法见下

#include <iostream>
#include <memory>class Entity
{
public:int x, y;Entity(int x, int y):x(x), y(y){std::cout << "Entity created!" << std::endl;}~Entity(){std::cout << "Entity destory by itself" << std::endl;}};int main()
{{std::unique_ptr<Entity> entity = std::make_unique<Entity>();    // 就一次内存分配,更效率std::unique_ptr<Entity> e(new Entity(1, 2));    // 先Entity()构造分配一次内存,再给unique_ptr分内存}std::cout << "Program is going done~" << std::endl;return 0;
}

但是unique_ptr不能共享指针给别人,从原理上来说,这个对象被释放以后手握这个对象的指针也都会嗝屁,实际上需要同步。从源码上来看,=号这个运算符被重载了。
下面看一下shared_ptr,一个可以共享的智能指针

#include <iostream>
#include <memory>class Entity
{
public:int x, y;Entity(int x, int y):x(x), y(y){std::cout << "Entity created!" << std::endl;}~Entity(){std::cout << "Entity destory by itself" << std::endl;}void print(){std::cout << "The value of x:" << x << ",y:" << y << std::endl;}
};int main()
{std::shared_ptr<Entity> e;{std::shared_ptr<Entity> shared_entity = std::make_shared<Entity>(); // 性能缘由同上std::shared_ptr<Entity> shared_entity_new(new Entity(1, 2));e = shared_entity;}e->print();std::cout << "Program is going done~" << std::endl;return 0;
}

shared_ptr底层实现类似计数器,不分享的时候相当于在unique_ptr和计数器=0,分享一次就会计数器++。当计数器为0后,再结束生命周期就会delete这个对象本体(在堆上),否则只是释放了指针本身的内存(在栈上)。给weak_ptr分享不会增加计数器。

C++计算偏移量

计算偏移量在计算机图形学里比较多见,先写一下具体过程

#include <iostream>struct Vector3
{float x, y, z;
};int main()
{int offset = (int)&((Vector3*)nullptr)->y;std::cout << offset << std::endl;std::cin.get();return 0;
}

代码中offset就是偏移量。首先将0或者nullptr强制转化为结构体或类的指针,再去通过->调用指针就会根据偏移量偏移到目标的起始位置(这就是我们需要的值),之后取这个位置的地址(因为使用0或者nullptr作为起始地址所以不用再考虑起始地址)用&取地址(内存编号为偏移量),再通过(int)强制转换成整数就得到了偏移量

C++中优化std vector三个简单方法

我们先来写一段代码实验一下

#include <iostream>
#include <vector>struct Vertex
{float x, y, z;Vertex(float x, float y, float z): x(x), y(y), z(z){}// copy constructorVertex(const Vertex& vertex): x(vertex.x), y(vertex.y), z(vertex.z){std::cout << "Copied!" << std::endl;}
};int main()
{std::vector<Vertex> vertices;vertices.push_back({ 1, 2, 3 }); //1号语句vertices.push_back({ 4, 5, 6 }); //2号语句vertices.push_back({ 7, 8, 9 }); //3号语句return 0;
}

这段代码中我们规定:Vertex结构体,每当被复制后就向控制台输出
经过实际运行后,这段代码一共输出了 6 行Copied,说明在添加到vector时Vertex被复制了六次。以下是流程:执行到1号语句时vertices的承载力为0,产生新的vertices并将旧的vertices复制到新的vertices中此时输出1次Copied,到二号语句,承载力不够,接着出现新的容器,旧的vertices中已经有的Vertex和新的Vertex都会被复制到新的容器中,此时复制了两次,即输出两次Copied,以此类推三号语句输出了三次Copied,最后即输出了1+2+3次即6次Copied
这段过程看似在计算机强大算力前不复杂,但是当push_back次数多了以后复制次数就会爆炸式增长

解决方案 一

先告诉vector给留多少空间,避免了多次复制

#include <iostream>
#include <vector>struct Vertex
{float x, y, z;Vertex(float x, float y, float z): x(x), y(y), z(z){}// copy constructorVertex(const Vertex& vertex): x(vertex.x), y(vertex.y), z(vertex.z){std::cout << "Copied!" << std::endl;}
};int main()
{std::vector<Vertex> vertices;vertices.reserve(3);    // 预留空间vertices.push_back(Vertex(1, 2, 3));vertices.push_back(Vertex(4, 5, 6));vertices.push_back(Vertex(7, 8, 9));return 0;
}

在这里通过reserve告诉vector给我留3个单位的空间,运行完毕后仅输出了 3 次Copied,即没有新的容器创建

解决方案 二

通过调用类或者结构体的构造器,函数括号内为构造器对应参数

#include <iostream>
#include <vector>struct Vertex
{float x, y, z;Vertex(float x, float y, float z): x(x), y(y), z(z){}// copy constructorVertex(const Vertex& vertex): x(vertex.x), y(vertex.y), z(vertex.z){std::cout << "Copied!" << std::endl;}
};int main()
{std::vector<Vertex> vertices;vertices.emplace_back(1, 2, 3);vertices.emplace_back(4, 5, 6);vertices.emplace_back(7, 8, 9);return 0;
}

此方法效率和法一相同,实现机制不同

解决方案 三(二 + 一)

预留好空间后再使用emplace不会产生任何复制(预留空间>=实际需求空间)

#include <iostream>
#include <vector>struct Vertex
{float x, y, z;Vertex(float x, float y, float z): x(x), y(y), z(z){}// copy constructorVertex(const Vertex& vertex): x(vertex.x), y(vertex.y), z(vertex.z){std::cout << "Copied!" << std::endl;}
};int main()
{std::vector<Vertex> vertices;vertices.reserve(3);vertices.emplace_back(1, 2, 3);vertices.emplace_back(4, 5, 6);vertices.emplace_back(7, 8, 9);return 0;
}

此示例Vertex类没有发生复制

相关文章:

C++随心记

C随心记 C中的 CONST C中的const是表示不可修改 int main() {/* 对于变量而言 */// 不可修改的常量const int A 10;// 不可修改的指针指向const int* pointer_0 nullptr;int const* poniter_1 nullptr;// 不可修改指针指向的内容int* const poniter_2 nullptr; }const也…...

【微服务即时通讯系统】——brpc远程过程调用、百度开源的RPC框架、brpc的介绍、brpc的安装、brpc使用和功能测试

文章目录 brpc1. brpc的介绍1.1 rpc的介绍1.2 rpc的原理1.3 grpc和brpc 2. brpc的安装3. brpc使用3.1 brpc接口介绍 4. brpc使用测试4.1 brpc同步和异步调用 brpc 1. brpc的介绍 1.1 rpc的介绍 RPC&#xff08;Remote Procedure Call&#xff09;远程过程调用&#xff0c;是一…...

鸿蒙开发(NEXT/API 12)【状态查询与订阅】手机侧应用开发

注意 该接口的调用需要在开发者联盟申请设备基础信息权限与穿戴用户状态权限&#xff0c;穿戴用户状态权限还需获得用户授权。 实时查询穿戴设备可用空间、电量状态。订阅穿戴设备连接状态、低电量告警、用户心率告警。查询和订阅穿戴设备充电状态、佩戴状态、设备模式。 使…...

vite中sass警告JS API过期

1.问题 在Vite创建项目中引入Sass弹出The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0 - vite中sass警告JS API过期 The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0警告提示表明你当前正在使用的 Dart Sass 版本中&#…...

睢宁自闭症寄宿学校:培养特殊孩子的未来

在自闭症儿童的教育与康复领域&#xff0c;每一所学校的努力都是对孩子们未来无限可能的一次深刻诠释。从江苏睢宁到广东广州&#xff0c;自闭症寄宿学校正以不同的方式&#xff0c;为这些特殊的孩子铺设一条通往未来的希望之路。其中&#xff0c;广州的星贝育园自闭症儿童寄宿…...

【Canvas与徽章】金圈蓝底国庆75周年徽章

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>金边黑盾75周年</title><style type"text/css"&g…...

Java Servlet 详解

Java Servlet 是 Java 企业级应用 中的一个核心组件&#xff0c;特别是在 Web 应用开发中&#xff0c;它为服务器端处理请求提供了基础。每次用户发出请求时&#xff0c;Servlet 都会动态生成响应&#xff0c;这在构建复杂、交互式的 Web 应用时尤为重要。 什么是 Servlet&am…...

yolov8/9/10模型在安全帽、安全衣检测中的应用【代码+数据集+python环境+GUI系统】

yolov8910模型安全帽、安全衣检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10模型在安全帽、安全衣检测中的应用【代码数据集python环境GUI系统】 背景意义 安全帽和安全衣在工业生产、建筑施工等高风险作业环境中是保护工人免受意外伤害的重要装备。然而&#xff0…...

算力共享系统中数据平面和控制平面

目录 算力共享系统中数据平面和控制平面 数据平面 控制平面 算力共享系统举例 控制流程和业务流程,在算力共享系统中举例说明 控制流程 业务流程 算力共享系统中数据平面和控制平面 在算力共享系统中,数据平面和控制平面是两个关键组成部分,它们各自承担着不同的角色…...

C++语言学习(4): identifier 的概念

1. 什么是 identifier identifier 中文意思是标识符&#xff0c;在 cppreference 中明确提到&#xff0c;identifier 是任意长度的数字、下划线、大写字母、小写字母、unicode 字符 的序列&#xff1a; An identifier is an arbitrarily long sequence of digits, underscores…...

浅谈计算机神经网络基础与应用

1. 绪论 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。作为AI技术的核心组成部分,神经网络在推动这一领域的发展上扮演着至关重要的角色。本报告旨在探讨AI中的不同类型神经网络及其在实际应用中的表现和影响。我们将从神经网络的基本概念入手,逐步…...

【SpringBoot详细教程】-08-MybatisPlus详细教程以及SpringBoot整合Mybatis-plus【持续更新】

目录 🌲 MyBatis Plus 简介 🌾入门案例 🌾 MP 简介 🌲 MP 的CRUD 🌾 新增 🌾 删除 🌾 修改在进行 🌾 根据ID查询 🌾 查询所有 🌲 分页功能 🌾 设置分页参数 🌾 设置分页拦截器 🌲 优化启动 🌾 取消mbatisPlusBanner 🌾 取消Sprin…...

[20241002] OpenAI融资文件曝光,ChatGPT年收入涨4倍,月费5年内翻倍

智东西9月29日消息&#xff0c;据《纽约时报》9月27日报道&#xff0c;OpenAI的内部文件显示&#xff0c;该公司在8月份的月收入达到3亿美元&#xff0c;自2023年初以来增长了1700%&#xff0c;预计今年年度销售额将达到37亿美元&#xff0c;其中ChatGPT将带来27亿美元的收入。…...

工业缺陷检测——Windows 10本地部署AnomalyGPT工业缺陷检测大模型

0. 引言 在缺陷检测中&#xff0c;由于真实世界样本中的缺陷数据极为稀少&#xff0c;有时在几千甚至几万个样品中才会出现一个缺陷数据。因此&#xff0c;以往的模型只需在正常样本上进行训练&#xff0c;学习正常样品的数据分布。在测试时&#xff0c;需要手动指定阈值来区分…...

单元测试进阶-Mock使用和插桩

目录 一、基本概念 1、Mock 2、插桩&#xff08;Sutbbing&#xff09; 二、参考文章 一、基本概念 1、Mock Mock的作用就是不直接new对象&#xff0c;而是使用Mock方法或者注解Mock一个对象。 这个对象他不是new创建的对象&#xff0c;Mock对该对象的一些成员变量和方法…...

适用conda安装虚拟的python3环境

由于jupyter notebook 7以上的版本与jupyter_contrib_nbextensions存在冲突,导致以前使用顺手的插件无法使用了,就考虑建立一个虚拟环境,在里面使用jupyter notebook 6,以便和jupyter_contrib_nbextensions兼容。 conda简介和优势 Conda 是一个包管理器和环境管理器,它不…...

【C++】“list”的介绍和常用接口的模拟实现

【C】“list”的介绍和常用接口的模拟实现 一. list的介绍1. list常见的重要接口2. list的迭代器失效 二. list常用接口的模拟实现&#xff08;含注释&#xff09;三. list与vector的对比 一. list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xf…...

第九篇——数列和级数(二):传销骗局的数学原理

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 文章不长&#xff0c;但是道理深刻&#xff1b;相邻两个数的差值&#xf…...

docker如何查看容器的ip

要查看Docker容器的IP地址&#xff0c;可以使用以下几种方法&#xff1a; 使用docker inspect命令&#xff1a; docker inspect -f {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} <容器ID或名称> 使用docker ps和docker inspect组合&#xff1a; 首先查看正…...

Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错

文章目录 一、问题报错二、ONLY_FULL_GROUP_BY模式2.1、什么是ONLY_FULL_GROUP_BY&#xff1f;2.2、为什么要使用ONLY_FULL_GROUP_BY&#xff1f;2.3、查看sql_mode 三、解决方法3.1、关闭only_full_group_by模式3.1.1、方法一&#xff1a;关闭当前会话中的only_full_group_by3…...

设计模式(2)工厂模式

让一个工厂类去生产出对象 &#xff08;new &#xff09;来。 我们想要一个 形状&#xff0c;我们用工厂去生产出&#xff0c;圆形&#xff0c;方形。 package com.example.factory2;public interface Shape {void draw(); }public class Square implements Shape {Overridep…...

二分查找算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 目录 二分查找算法的介绍 704. 二分查找 34. 在排序数组中查找元素的第一个和 最后一个位置 35. 搜索插入位置 69. x的平…...

ACP科普:SoS不是救命

Scrum of Scrums&#xff08;SoS&#xff09;是一种用于协调多个Scrum团队之间工作的扩展框架&#xff0c;特别适用于大型项目或组织中有多个团队同时进行开发的情况。它帮助团队在保持敏捷性的同时&#xff0c;解决跨团队的依赖和协调问题。以下是对Scrum of Scrums的详细介绍…...

C++:模拟实现vector

目录 成员变量与迭代器 size capacity empty 迭代器有关函数 实现默认成员函数的前置准备 reserve ​编辑 ​编辑 push_back 构造函数 无参构造 迭代器区间构造 n个val来进行构造 析构函数 拷贝构造函数 赋值重载 增删查改 clear resize pop_back inser…...

Leecode SQL 184. Department Highest Salary 找出tie

Department Highest Salary 注意&#xff01;要找出 tie 的 highest salary&#xff01; Write a solution to find employees who have the highest salary in each of the departments. Return the result table in any order. The result format is in the following ex…...

[Redis][典型运用][缓存]详细讲解

目录 0.什么是缓存&#xff1f;1.使用Redis作为缓存1.为什么用&#xff1f;2.如何用&#xff1f; 2.缓存的更新策略0.前言1.定期生成2.实时生成 3.缓存相关问题1.缓存预热(Cache Preheating)2.缓存穿透(Cache Penetration)3.缓存雪崩(Cache Avalanche)4.缓存击穿(Cache Breakdo…...

GPG error golang 1.19

1. 问题描述及原因分析 在飞腾2000的服务器&#xff0c;OS为Kylin Linux Advanced Server release V10环境下&#xff0c;docker版本为18.09.0&#xff08;docker-engine-18.09.0-101.ky10.aarch64&#xff09;&#xff0c;基于容器镜像golang:1.19编译新的容器镜像&#xff0…...

Linux如何查看每个文件及文件夹的大小

查看当前目录下每个文件夹的大小&#xff0c;包括其内部所有文件&#xff1a; du -sh *-s&#xff1a;仅显示每个文件夹的总大小&#xff0c;而不是每个文件。-h&#xff1a;以人类可读的格式显示。...

Word样式的同步与重置

有时候我们需要修改Word中的样式&#xff0c;实现排版的个性化。 如何同步样式到其他电脑上&#xff1f; Word中的样式是由Normal.dotm文件控制的&#xff0c;对样式所有的设置和修改&#xff0c;都会保存到这个问题件中&#xff0c;所以我们只需要在设置好样式以后&#xff…...

力扣 —— 跳跃游戏

题目一(中等) 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&…...

建设医疗网站/关键词批量调词 软件

实验目的&#xff1a; 1 使用ADLDAP验证用户 2 在AD中给用户添加banner 拓扑&#xff1a; ASA配置&#xff1a; : Saved : ASA Version 8.4(2) ! hostname ciscoasa enable password 8Ry2YjIyt7RRXU24 encrypted passwd 2KFQnbNIdI.2KYOU encrypted names ! interface Gigabit…...

做网站需要编程?/清远疫情防控措施

spark入门实战http://www.cnblogs.com/shishanyuan/p/4699644.html转载于:https://blog.51cto.com/wilsonking/1747157...

哈尔滨网站制作公司价格/google关键词挖掘工具

起源 自己经历过的面试也不少了&#xff0c;互联网的、外企的&#xff0c;都有。总结一下这些面试的经验&#xff0c;发现面试官问的问题其实不外乎几个大类&#xff0c;玩不出太多新鲜玩意的。细细想来&#xff0c;面试官拥有以下七种武器。恰似古龙先生笔下的武侠世界中的七种…...

问卷调查网站JAVA怎么做/建设网站公司

1415. [NOIP2001]数的计数 ☆ 输入文件&#xff1a;nums.in 输出文件&#xff1a;nums.out 简单对比 时间限制&#xff1a;1 s 内存限制&#xff1a;256 MB 【题目描述】 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000)&#xff0c…...

湖州建设局投标网站/国外网站seo

从乙方到甲方&#xff0c;我在做什么 最近&#xff0c;总有朋友在问&#xff0c;从一座熟悉的城市到陌生的环境&#xff0c;从乙方到甲方&#xff0c;这个转换挺大的&#xff0c;会不会有挫败感&#xff0c;你平时工作内容主要是哪些&#xff1f; 答&#xff1a;还好吧&#…...

wordpress用户批量注册/惠州seo快速排名

一、继承Thread类创建线程类(1)定义Thread类的子类&#xff0c;并重写该类的run方法&#xff0c;该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。(2)创建Thread子类的实例&#xff0c;即创建了线程对象。(3)调用线程对象的start()方法来启动该线程。二…...