move与函数指针的简单使用
std::move()
C++11的标准库 提供了一个非常有用的函数 std::move(),std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。
就是说 std::move(str); 之后原来的值因为变成了右值失效了
但是这样赋值可以避免出现拷贝
#include <iostream>
#include <string>
#include <vector>
using namespace std;int main()
{string str = "hello";cout << "before str: " << str << endl;vector<string> vstr;vstr.emplace_back(std::move(str));cout << "after str: " << str << endl;return 0;
}
str 就没有了因为被转移语义了
#include <iostream>
#include <functional>
#include <utility>
#include "tinyNetWorkLib.h"
class People{using actionEvent = std::function<void()>;public:People():value(2){}People(int v):value(v){}void setCryEvent(actionEvent func){ cry = std::move(func); }void setSimleEvent(actionEvent func){ smile = std::move(func);}void handleEvent(Timestamp receiverTime){if(value >= 0){smile(); cout<<receiverTime.toFormattedString()<<endl;}else{cry();cout<<receiverTime.toFormattedString()<<endl;}}
private:actionEvent cry;actionEvent smile;int value;
};
int main()
{std::function<void()> func = []{std:: cout<<"happy"<<std::endl; };std::function<void()> func2 = []{std::cout<<"cry"<<std::endl;};People peo;peo.setCryEvent(func2);peo.setSimleEvent(func);peo.handleEvent(Timestamp ::now());// std::cout << "Hello world" << std::endl;return 0;
}
执行结果
happy
2023/08/27 20:49:59
这里函数指针还能用,因为这里转移语义的对象是参数
给出依赖文件的代码Timestamp 复制下来用就好
记得给个#ifndef这里自己
#include <functional>
#include <set>
#include <sys/time.h>
#include <sys/eventfd.h>
#include <fcntl.h>
#include <unistd.h>
#include <mutex>
#include<unordered_map>
using namespace std;
class Timestamp
{
public:Timestamp(): microSecondsSinceEpoch_(0){}explicit Timestamp(int64_t microSecondsSinceEpoch): microSecondsSinceEpoch_(microSecondsSinceEpoch){}// 获取当前时间戳static Timestamp now();//用std::string形式返回,格式[millisec].[microsec]std::string toString() const;//格式, "%4d年%02d月%02d日 星期%d %02d:%02d:%02d.%06d",时分秒.微秒std::string toFormattedString(bool showMicroseconds = false) const;//返回当前时间戳的微妙int64_t microSecondsSinceEpoch() const { return microSecondsSinceEpoch_; }//返回当前时间戳的秒数time_t secondsSinceEpoch() const{ return static_cast<time_t>(microSecondsSinceEpoch_ / kMicroSecondsPerSecond); }// 失效的时间戳,返回一个值为0的Timestampstatic Timestamp invalid(){return Timestamp();}// 1秒=1000*1000微妙static const int kMicroSecondsPerSecond = 1000 * 1000;private:// 表示时间戳的微秒数(自epoch开始经历的微妙数)int64_t microSecondsSinceEpoch_;
};/*** 定时器需要比较时间戳,因此需要重载运算符*/
inline bool operator<(Timestamp lhs, Timestamp rhs)
{return lhs.microSecondsSinceEpoch() < rhs.microSecondsSinceEpoch();
}inline bool operator==(Timestamp lhs, Timestamp rhs)
{return lhs.microSecondsSinceEpoch() == rhs.microSecondsSinceEpoch();
}// 如果是重复定时任务就会对此时间戳进行增加。
inline Timestamp addTime(Timestamp timestamp, double seconds)
{// 将延时的秒数转换为微妙int64_t delta = static_cast<int64_t>(seconds * Timestamp::kMicroSecondsPerSecond);// 返回新增时后的时间戳return Timestamp(timestamp.microSecondsSinceEpoch() + delta);
}Timestamp Timestamp::now()
{struct timeval tv;// 获取微妙和秒// 在x86-64平台gettimeofday()已不是系统调用,不会陷入内核, 多次调用不会有性能损失.gettimeofday(&tv, NULL);int64_t seconds = tv.tv_sec;// 转换为微妙return Timestamp(seconds * kMicroSecondsPerSecond + tv.tv_usec);
}// 2022/08/26 16:29:10
// 20220826 16:29:10.773804
std::string Timestamp::toFormattedString(bool showMicroseconds) const
{char buf[64] = {0};time_t seconds = static_cast<time_t>(microSecondsSinceEpoch_ / kMicroSecondsPerSecond);// 使用localtime函数将秒数格式化成日历时间tm *tm_time = localtime(&seconds);if (showMicroseconds){int microseconds = static_cast<int>(microSecondsSinceEpoch_ % kMicroSecondsPerSecond);snprintf(buf, sizeof(buf), "%4d/%02d/%02d %02d:%02d:%02d.%06d",tm_time->tm_year + 1900,tm_time->tm_mon + 1,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec,microseconds);}else{snprintf(buf, sizeof(buf), "%4d/%02d/%02d %02d:%02d:%02d",tm_time->tm_year + 1900,tm_time->tm_mon + 1,tm_time->tm_mday,tm_time->tm_hour,tm_time->tm_min,tm_time->tm_sec);}return buf;
}
最后我们给出要给第一个版本的channel
一个文件描述符,发生读事件 写时间 关闭事件 错误事
文件描述符就是一个整形变量
int revents 表示这个文件描述符的心情(状态)
通过位运算表示 和EPOLLINT OUT HUB 先不管
#include <functional>
#include "tinyNetWorkLib.h"
#include <sys/epoll.h>class Channel{using EventCallback = std::function<void()>;using ReadEventCallback = std::function<void(Timestamp)>;
public: Channel(int fd):fd_(fd){};void setReadCallback(ReadEventCallback cb) { readCallback_ = std::move(cb); }void setWriteCallback(EventCallback cb) { writeCallback_ = std::move(cb); }void setCloseCallback(EventCallback cb) { closeCallback_ = std::move(cb); }void setErrorCallback(EventCallback cb) { errorCallback_ = std::move(cb); } void set_revents(int revt){ revents = revt; }void handleWithGuard(Timestamp receiverTime){if(revents & EPOLLHUP && !(revents & EPOLLIN)){if(closeCallback_){closeCallback_();}}if(revents & EPOLLERR){if(errorCallback_){errorCallback_();} }if(revents & (EPOLLIN|EPOLLPRI)){if(readCallback_){readCallback_(receiverTime);}}if(revents & EPOLLOUT){if(writeCallback_){writeCallback_();}}}private:ReadEventCallback readCallback_;EventCallback writeCallback_;EventCallback closeCallback_;EventCallback errorCallback_;const int fd_;int revents;};
这个和我们People类设计几乎一样除了设计了一点系统知识
#include <iostream>
#include <functional>
#include <utility>
#include "tinyNetWorkLib.h"
#include "Channel.h"
class People{using actionEvent = std::function<void()>;public:People():value(2){}People(int v):value(v){}void setCryEvent(actionEvent func){ cry = std::move(func); }void setSimleEvent(actionEvent func){ smile = std::move(func);}void handleEvent(Timestamp receiverTime){if(value >= 0){smile(); cout<<receiverTime.toFormattedString()<<endl;}else{cry();cout<<receiverTime.toFormattedString()<<endl;}}int set_value(int v){value = v;}
private:actionEvent cry;actionEvent smile;int value;
};
int main()
{std::function<void()> func = []{std:: cout<<"happy"<<std::endl; };std::function<void()> func2 = []{std::cout<<"cry"<<std::endl;};// People peo;// peo.setCryEvent(func2);// peo.setSimleEvent(func);// peo.handleEvent(Timestamp ::now());// std::cout << "Hello world" << std::endl;// func();Channel chanel(1);chanel.set_revents(EPOLLOUT);chanel.setWriteCallback(func);chanel.handleWithGuard(Timestamp::now());return 0;
}
执行结果
happy相关文章:
move与函数指针的简单使用
std::move() C11的标准库 提供了一个非常有用的函数 std::move(),std::move() 函数将一个左值强制转化为右值引用,以用于移动语义。 就是说 std::move(str); 之后原来的值因为变成了右值失效了 但是这样赋值可以避免出现拷贝 #include <iostream&g…...
第五章 树与二叉树 二、二叉树的定义和常考考点
一、定义 二叉树可以用以下方式详细定义: 二叉树是由节点构成的树形结构,每个节点最多可以有两个子节点。每个节点有以下几个属性: 值:存储该节点的数据。左子节点:有一个左子节点,如果没有则为空。右子节…...
算法笔记/USACO Guide GOLD金组DP 1. Introduction to DP
USACO Guide中金组的内容分为一下六个章节 DP数学图论数据结构树一些附加主题 今天学习DP,以下内容: 初入DP背包DP图表中的路线最长递增序列状态压缩DP区间DP数位DP 初入DP Dynamic Programming (DP) is an important algorithmic technique in Comp…...
天锐绿盾安全U盘系统
安全U盘系统 01 简介 天锐绿盾安全U盘系统,是一款致力于保障U盘数据内容安全的产品。通过严格身份认证、便捷安全的密保机制、智能的U盘锁定或自毁设置、详细的文件操作日志、文件粉碎、设置还原等,天锐绿盾安全U盘系统为您U盘的数据保驾护航࿰…...
灰色预测模型
当谈论灰色预测时,通常是指灰色系统理论,它是一种用于处理少量数据或缺乏充分信息的情况下进行预测和分析的数学方法。灰色预测的核心思想是通过建立灰色模型来分析和预测数据的变化趋势。 我会解释灰色预测的基本原理、步骤和方法: 1. 灰色…...
Yolo系列-yolov1
YOLO-V1 经典的one-stage方法 YouOnlyLookOnce,名字就已经说明了一切!把检测问题转化成回归问题,一个CNN就搞定了!可以对视频进行实时检测,应用领域非常广! 核心思想: Yolov1的核心思想是将对象…...
单片机TVS/ESD二极管防护
TVS 瞬态电压抑制二极管Transient Voltage Suppressor ESD 静电释放二极管 Electro-Static discharge 这两种本质上都是二极管。都是利用了二极管正向导通、反向截止的特性。二极管在反向截止截止条件下,如果电压继续增大,将会引发雪崩,使得…...
TCP协议的重点知识点
TCP协议的重点知识点 TCP(传输控制协议)是一种面向连接、可靠的数据传输协议,工作在传输层,提供可靠的字节流服务。它是互联网协议栈中最重要、最复杂的协议之一,也是面试中常被问到的知识点。本文将详细介绍TCP协议的各个重要概念。 TCP基本特性 TCP主要具有以下基本特性: …...
大数据——一文熟悉HBase
1、HBase是什么 HBase是基于HDFS的数据存储,它建立在HDFS文件系统上面,利用了HDFS的容错能力,内部还有哈希表并利用索引,可以快速对HDFS上的数据进行随时读写功能。 Hadoop在已经有一个HiveMapReduce结构的数据读写功能&#x…...
如何有效进行RLHF的数据标注?
编者按:随着大语言模型在自然语言处理领域的广泛应用,如何从人类反馈进行强化学习(RLHF)已成为一个重要的技术挑战。并且RLHF需要大量高质量的人工数据标注,这是一个非常费力的过程。 本文作者在数据标注领域具有丰富经…...
2023年8月22日OpenAI推出了革命性更新:ChatGPT-3.5 Turbo微调和API更新,为您的业务量身打造AI模型
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
windows配置wsl,Unbuntu启动GPU加速
wsl全称Windows Subsystem for Linux,windows电脑下的linux子系统,对于想用Linux的Windows用户来说wsl是一个不错的选择。 安装wsl 两种方法可以安装wsl,这个默认安装在C盘。 方法一运行命令安装 wsl --install方法二,在windo…...
Postman测WebSocket接口
01、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直…...
【内网穿透】搭建我的世界Java版服务器,公网远程联机
目录 前言 1. 搭建我的世界服务器 1.1 服务器安装java环境 1.2 配置服务端 2. 测试局域网联机 3. 公网远程联机 3.1 安装cpolar内网穿透 3.1.1 windows系统 3.1.2 linux系统(支持一键自动安装脚本) 3.2 创建隧道映射内网端口 3.3 测试公网远程…...
Unable to Locate package python2| Linux Ubuntu系统下python2的安装
Linux Ubuntu系统下python2的安装 FSL的安装脚本是用Python2写的,新版本的Ubuntu (16以后)在默认情况下没有安装Python2。在终端输入 python2,若提示没有相应的命令,则需要先安装Python2,如下指令…...
从上帝视角俯瞰vue2路由(简单易懂)
文章目录 路由原理(hash)路由安装和使用(vue2)路由跳转路由的传参和取值嵌套路由路由守卫完整代码 路由原理(hash) 单页应用的路由模式有两种 哈希模式(利用hashchange 事件监听 url的hash 的…...
STL-空间配置器的了解
前言 空间配置器,顾名思义就是为了各个容器高效的管理空间(空间的申请与回收)的,在默默的工作的。虽然在常规上使用STL时,可能用不上它,但是站在学习研究的角度,学习它的实现原理对我们有很大的…...
哔哩哔哩 B站 bilibili 视频视频音效调节 清澈人声
视频音效调节方式:直接视频播放内容界面内鼠标右键点击视频音效调节 注意:需要使用的是谷歌浏览器,我的火狐浏览器试了不行,都没选项,火狐的出来的界面是这样的: 目录 具体操作如下: 1、谷歌…...
下一代存储解决方案:湖仓一体
文章首发地址 湖仓一体是将数据湖和数据仓库相结合的一种数据架构,它可以同时满足大数据存储和传统数据仓库的需求。具体来说,湖仓一体可以实现以下几个方面的功能: 数据集成: 湖仓一体可以集成多个数据源,包括结构…...
IntelliJ IDEA 2023.2.1 修复版本日志
我们刚刚发布了 v2023.2 的第一个错误修复更新。 您可以从 IDE 内部、使用工具箱应用程序或通过快照(如果您使用的是 Ubuntu)更新到此版本。您也可以直接从我们的网站下载。 以下是最新版本中包含的最值得注意的改进和修复的列表: 我们已经解…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
