const

c++11——auto,decltype类型推导

蓝咒 提交于 2020-03-28 07:57:29
c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率。 auto和decltype的类型推导都是编译器在编译的时候完成的,auto是通过定义auto变量时候给出的表达式的值推导出实际类型,并且 在声明auto变量时必须马上初始化 ;decltype通过表达式的值推导出实际的类型,但是可以只声明变量,而不赋值。 auto类型推导 1. auto推导 auto x = 5; //被编译器推导为int类型 auto pi = new auto(1); //编译器推导为int const auto* v = &x, u = 5; //v为 const int*, u为 const int static auto y = 0.1; //y为static const double auto s; //出错! auto变量不能只声明不初始化 2. auto推导规则 (1)当不声明为指针或引用时,auto的推导结果和初始化表达式抛弃引用和cv限定符后的类型一致;(cv限定符: const volatile限定符) (2)当声明为指针或引用时,auto的推导结果将保留初始化表达式的cv限定符。 int x = 0; auto *a = &x; //a为 int* auto b = &x; //b为 int*

C++11标准之右值引用(ravalue reference)

白昼怎懂夜的黑 提交于 2020-03-28 02:57:00
1、右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题。但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision、RVO(包括NRVO)等编译器优化技术,它们可以防止某些情况下临时对象产生和拷贝。下面简单地介绍一下Copy Elision、RVO,对此不感兴趣的可以直接跳过: (1) Copy Elision Copy Elision技术是为了防止某些不必要的临时对象产生和拷贝,例如: struct A { A(int) {} A(const A &) {} }; A a = 42; 理论上讲,上述A a = 42;语句将分三步操作:第一步由42构造一个A类型的临时对象,第二步以临时对象为参数拷贝构造a,第三步析构临时对象。如果A是一个很大的类,那么它的临时对象的构造和析构将造成很大的内存开销。我们只需要一个对象a,为什么不直接以42为参数直接构造a呢?Copy Elision技术正是做了这一优化。 【说明】:你可以在A的拷贝构造函数中加一打印语句,看有没有调用,如果没有被调用,那么恭喜你,你的编译器支持Copy Elision。但是需要说明的是:A的拷贝构造函数虽然没有被调用,但是它的实现不能没有访问权限,不信你将它放在private权限里试试,编译器肯定会报错。 (2) 返回值优化(RVO,Return

洛谷P2294 [HNOI2005]狡猾的商人

荒凉一梦 提交于 2020-03-28 00:00:56
\(\large{题目链接}\) \(\\\) \(\Large\textbf{Solution: } \large{因为每次提供的是一段时间的利润,具体的每个月并不清楚,所以考虑直接判断前缀和是否合法即可。}\) \(\\\) \(\Large\textbf{Summary: } \large{像这种判断是否合法或者两者之间关系的题目,可以往图上想一想。}\) \(\\\) \(\Large\textbf{Code: }\) #include <bits/stdc++.h> #define gc() getchar() #define LL long long #define rep(i, a, b) for (int i = (a); i <= (b); ++i) #define _rep(i, a, b) for (int i = (a); i >= (b); --i) using namespace std; const int N = 105; const int M = 1005; const int inf = 0x7fffffff; int w, n, m, cnt, head[N], vis[N], r[N], dis[N]; struct Edge { int to, next, val; }e[M << 1]; inline int read() { int

JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别

前提是你 提交于 2020-03-27 22:18:53
JavaScript:学习笔记(7)——VAR、LET、CONST三种变量声明的区别   ES2015(ES6)带来了许多闪亮的新功能,自2017年以来,许多JavaScript开发人员已经熟悉并开始使用这些功能。虽然这种假设可能是正确的,但仍有可能其中一些功能对某些人来说仍然是一个谜。   ES6带来的一个新特性是 新增了通过使用let、const来声明变量 。在本文中,我们将讨论var,let和const的范围,使用和提升。在您阅读时,请注意它们之间的差异,我会指出。 VAR VAR的范围   范围本质是意味着这些变量可供使用的位置。 var声明的范围是全局作用于或者本地函数作用域 。当一个var变量声明在函数外面时它的作用域是全局的,这意味着在整个窗口中可以使用在函数块外部使用var声明的任何变量。 var变量在函数内声明时是函数作用域 。这意味着它可用,只能在该函数中访问。   我们举一个例子: <script> var greeter = "Hello"; function hello() { var hi = "Hi"; } </script>   在这里,greeter是全局范围的,因为它存在于函数外部,而hello是函数作用域。所以我们不能在函数外部访问变量hi。所以,如果我们这样做:    var变量可以重新声明和更新   这个是比较好理解的    var变量提升

QQuickPaintedItem鼠标精准拾取(pick/select)研究

独自空忆成欢 提交于 2020-03-27 18:14:31
QT C++在2D图形方面已经做的很完善了,在PC端(Windows、Linux和MaC)上都有很好的表现。 QT中的QML特别适合于移动端应用的开发,QML中的一些基本形状类型并不是一一地与Qt C++相对应,但是通过C++可以来扩展QML。 QQuickPaintedItem继承自QQuickItem,提供了使用QPainter API的方法来扩展QML中的2D图形项。 QQuickPaintedItem没有像QGraphicsItem那样提供shape()方法来获取图形项的具体实际形状,但是其包含contains()方法,我们可以间接地结合鼠标操作点来判断是否包含在实际形状范围内。 废话不多说,直接上测试代码: CustomItem.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 #ifndef CUSTOMITEM_H #define CUSTOMITEM_H #include <QQuickPaintedItem> #include <QQuickItem> #include <QMouseEvent> #include <QPainter> class CustomItem : public

Vue2.0源码阅读笔记(二):响应式原理

夙愿已清 提交于 2020-03-27 11:45:22
  Vue是数据驱动的框架,在修改数据时,视图会进行更新。数据响应式系统使得状态管理变的简单直接,在开发过程中减少与DOM元素的接触。而深入学习其中的原理十分有必要,能够回避一些常见的问题,使开发变的更为高效。 一、实现简单的数据响应式系统   Vue使用 观察者模式 (又称 发布-订阅模式 )加 数据劫持 的方式实现数据响应式系统,劫持数据时使用 Object.defineProperty 方法将 数据属性 变成 访问器属性 。Object.defineProperty 是 ES5 中一个无法 shim 的特性,因此Vue 不支持 IE8 以及更低版本浏览器。   Vue源码中对数据响应式系统的实现比较复杂,在深入学习这部分源码之前,先实现一个较为简单的版本更有助于后续的理解。代码如下所示: let uid = 0 // 容器构造函数 function Dep() { // 收集观察者的容器 this.subs = [] this.id = uid++ } Dep.prototype = { // 将当前观察者收集到容器中 addSub: function(sub) { this.subs.push(sub) }, // 收集依赖,调用观察者的addDep方法 depend: function() { if(Dep.target){ Dep.target.addDep(this)

node_egg服务Service

五迷三道 提交于 2020-03-27 11:00:07
服务Server 定义service // app/service/user.js const Service = require('egg').Service class UserService extends Service { async find (uid) { const user = await this.ctx.mysql.query('SELECT * FROM user WHERE uid=?', uid); return user; } } module.exports = UserService; // 每次用户请求,都会实例化对应Service,继承于egg.Service,提供属性便利开发 · this.ctx: 当前请求的上下文Context对象的实例,处理当前请求的各种属性和方法 · this.app: 当前应用Application对象的实例,获取框架提供的全局对象和方法 · this.service: 应用定义的Service,可以访问到抽象出的业务层,等价于this.ctx.service · this.config: 应用运行时的配置项 · this.logger: logger对象,对象上有四个方法(debug, info, warn, error)分别代表打印不同级别的日志 Service ctx 详解 可以直接通过this

bcrypt 安装不成功解决办法

旧街凉风 提交于 2020-03-27 10:15:52
网站在登录前,需要进行注册收集用户基本信息,bcrypt 提供密码加密验证的方法,但是使用不正确,会给初学者带来各种问题。 bcrypt 的安装: npm i bcrypt 经过测试,经常安装不成功,原因和node.js的版本有原因,我在 下面这篇文章中有记录解决办法: bcrypt 安装不成功解决办法 但也不是万能的,如果还不能解决的话,可以尝试给 bcrypt 指定版本号安装: npm install --save bcrypt@2.0.1 一般是会成功的!! 用户在注册时,除了收集用户信息外,因为要用到 bcrypt ,必须要在注册时对密码进行加密,加密后再保存到数据库中。因为用户登录时,使用 bcrypt 的 compare 方法,这个方法是验证加密的密码的,如果在注册时没有加密,而登录时使用 compare 进行验证,直接会导致,将 mongodb 直接挂掉!而且登录也不会成功,也不报错,也不提示的这种尴尬的局面,会导致无从下手。 bcrypt 注册的逻辑: 收集用户(表单)的基本信息 bcrypt.genSalt() 给密码加密 加密完成,将数据保存在数据库 router.post('/register',urlencodedParser,(req,res) => { //验证 const newUser = new UserSchema({ email: req

koa 项目实战(九)passport验证token

杀马特。学长 韩版系。学妹 提交于 2020-03-27 09:20:59
1.安装模块 npm install koa-passport -D npm install passport-jwt -D 2.解析token 根目录/config/passport.js const JwtStrategy = require('passport-jwt').Strategy, ExtractJwt = require('passport-jwt').ExtractJwt; const keys = require('../config/keys'); const opts = {}; opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken(); opts.secretOrKey = keys.secretOrkey; const mongoose = require('mongoose'); const User = mongoose.model('users'); module.exports = passport => { passport.use(new JwtStrategy(opts, async function (jwt_payload, done) { // console.log(jwt_payload); const user = await User.findById

循环练习

╄→尐↘猪︶ㄣ 提交于 2020-03-27 03:34:13
//循环(计算某个数的位数) 输入一个正整数, 计算这个正整数的位数 //int main(int argc, const char * argv[]) { // int n; // int cnt=0; // scanf("%d", &n); // while (n) { // cnt++; // n/=10; // } // printf("cnt = %d\n", cnt); // // return 0; //} //a=1 b=1 //a+b/a 2/1 a = 2 b = 1 //a+b/a 3/2 a = 3 b = 2 //a+b/a 5/3 a = 5 b = 3 //... //9 流程控制(数值序列2) 输出数字序列 2/1,3/2,5/3,8/5,13/8,21/13...,输出个数由键盘输入。注意输入使用scanf输入 feibonaqi //\ //比如: // //输入 3输出为 // //2/1 //3/2 //5/3 // //输入 4 输出为 //2/1 //3/2 //5/3 //8/5 //\ //int main(int argc,const char *argv[]) //{ // int n; // int a=1,b=1; // scanf("%d", &n); // for (int i=0; i<n; i++) { // int