面试之快速学习C++14
文章参考:https://zhuanlan.zhihu.com/p/588826142?utm_id=0
最近学了一会感慨到找工作好难,上周面试了一家医疗公司,准备攒攒经验但是不去,结果三天了没消息,感觉一面都没过…
本来自傲看不上,结果人家也看不上你…没事攒攒经验,面试官问了是否会C++14我说我不会,问题不大,现在看看来得及~
1. 变量模版
/*1. 变量模版 ------------*/
//1.引入的意义,以前只有模版类和模版函数,比如我想定义一个各种类型的常量,那么不能用模版,C++14可以了
template <typename T>
constexpr T pi = T(3.1415926);//类内模版变量的定义
struct VariableTemplate1 {template<typename T>static T min;
};
//注意这里要加一个T ,min会使用默认值
template<typename T>
T VariableTemplate1::min = {};//但是你可以偏特化
template<>
const float VariableTemplate1::min<float> = 6.666;
template<>
const std::string VariableTemplate1::min<std::string> = "hhh";
//我可以理解为,变成了三个变量?
//变量模版和类型推导
template <typename T>
constexpr T pi1 = T{3.1415926};void testVariableTemplate() {//pi是一个doubledouble diameter = 2 * pi<double> * 3;std::cout << "diameter<double> = " << diameter <<std::endl;//pi是一个intdiameter = 2 * pi<int> * 3;std::cout << "diameter<int> = " << diameter <<std::endl;VariableTemplate1::min<int> = 3;std::cout << "VariableTemplate1::min = " << VariableTemplate1::min<int> <<std::endl;// VariableTemplate1::min<std::string> = "hhh"; //会报错,因为int模版对应了默认的模版值,现在不知道对应哪个模版std::cout << "VariableTemplate1::min = " << VariableTemplate1::min<std::string> <<std::endl;std::cout << "VariableTemplate1::min = " << VariableTemplate1::min<double> <<std::endl;std::cout << "VariableTemplate1::min = " << VariableTemplate1::min<float> <<std::endl;//0 ???是不是因为第一次确定类型之后就不会改了auto pi3 = pi<int>;auto pi4 = pi<double>;auto pi5 = pi<char>;std::cout << "pi3 = " << pi3 <<std::endl;std::cout << "pi4 = " << pi4 <<std::endl;std::cout << "pi5 = " << pi5 <<std::endl;/*diameter<double> = 18.8496diameter<int> = 18VariableTemplate1::min = 3VariableTemplate1::min = hhhVariableTemplate1::min = 0VariableTemplate1::min = 6.666pi3 = 3pi4 = 3.14159pi5 = */}
问题:
- 为什么一个min可以对应这么多值?所以实际上它是会根据实例化的值生成一个单独的值?
感受
1 . 它可以与auto配合使用去做类型转换,生成不同的常量。
2 . 可以用于在一个类里面定义很多不同类型的静态常量
2.lambda
/*2. lambda表达式的改动 ------------*/
//1. 支持lamda泛型参数
//2. 支持初始化捕获void testLambda() {int x = 7;//捕获x并给它初始值,意义在哪里?auto func = [x = 3](auto y) {return x+y;};//泛型参数这个比较好理解,初始化捕获有什么好处呢。在c++11中,lambda表示捕获变量只能通过值捕获或者引用捕获,支持了初始化表达式之后,我们就可以更灵活的捕获了,比如移动捕获std::string str = "xixixixi";std::string str1;auto func1 = [str1 = std::move(str)]{return str1 + ", hhhhhh";};std::cout << "func(3)" << func(3) << std::endl;std::cout << "func(4.5)" << func(4.5) << std::endl;std::cout << "func1()" << func1() << std::endl;/*func(3)6func(4.5)7.5func1()xixixixi, hhhhhh*/
}
//如果有学习c++11的function、bind以及lambda表达式,你应该会知道bind相对于lambda表达式的两个最重要的优势就是泛型参数和移动捕获,从c++14之后,bind的这个两个优势就完全不复存在了,并且lambda表达式对象会比bind生成的对象更小,所以基本上可以让bind光荣的下岗了(但是实际bind到了c++20以后也依旧存在,哪可能有它存在的意义把)。
3. constexpr限制放宽
/*
3. constexpr限制放宽------c++11中constexpr修饰变量,要求变量必须是可以在编译器推导出来;
constexpr修饰函数(其实就是修饰函数返回值),除了可以包含 using 指令、typedef 语句以及 static_assert 断言外,只能包含一条 return 返回语句;
constexpr同时可以修饰构造函数,但是也会要求使用这个构造函数时,可以在编译器就把相关的内容全部推导出来
c++14中,对constexpr的限制放宽了,允许使用循环、if、switch等等语句,但是主旨还是一样的,需要在编译期间就可以计算出全部内容,限制放宽之后,这个关键字便可以更灵活的使用了。*/
//比如在c++11中如果想用constexpr计算前n项和,那么需要像下面这样写constexpr int testConexpresFunc1(int n) {return n > 0 ? testConexpresFunc1(n - 1) + n : 0;
}//在c++14中就可以使用if、局部变量和循环了(c++14可以,c++11报错)
constexpr int testConexpresFunc2(int n) {if (n <= 0){return 0;}int sum = 0;for (int i = 1; i <= n; ++i) {sum += i;}return sum;/*testConexpresFunc1(5) = 15testConexpresFunc2(5) = 15*/
}
4. 数字分隔符
// 三个数字的结果完全一样int val1 = 100000000;int val2 = 100'000'000;int val2 = 100'00'0'0'0'0;
5. 函数返回值推导
/*5. 函数返回值推导 ------------*///回顾c++11返回值类型后置,一定要auto + decltype
template<typename T, typename U>
auto add1(T a, U b)->decltype(a+b) {return a+b;
}//c++14之后相当于不需要decltype了
template<typename T, typename U>
auto add2(T a, U b) {return a+b;
}//限制条件如下:
//1. 如果有多个推导语句,那么推导的结果必须保持一致,实际上编译器就是根据函数里面的return推导的吧!
// 编译报错,第一个return推导为int,第二个return推导为double,两次推导结果不一致
//报错: 'auto' in return type deduced as 'double' here but deduced as 'int' in earlier return statement
//auto add3 (int flag)
//{
// if (flag < 0)
// {
// return 1 ;
// }
// else
// {
// return 3.14;
// }
//}//2.如果没有return或者return为void类型,那么auto会被推导为void。
//3. 一旦在函数中看到return语句,从该语句推导出的返回类型就可以在函数的其余部分中使用,包括在其他return语句中,即,优先推导论,优先推导是什么类型就是类型。
auto add4(int i)
{if (i <= 1){return i; // 返回值被推导为int}else{return add4(i - 1) + i; // sum的返回值已经被推导出来了,所以这里是没有问题的}
}
//报错:Function 'add5' with deduced return type cannot be used before it is defined
//auto add5(int i)
//{
// if (i > 1)
// {
// return add5(i - 1) + i;
// }
// else
// {
// return i;
// }
//}
//4. 不能推导初始化列表。
//报错:Cannot deduce return type from initializer list
//auto add6(int i)
//{
// return {1,2,3,4};
//}
//5. 虚函数不能使用返回值推导void testTrailingReturnType() {std::cout << "add1(5,2) = " << add1(5,2) << std::endl;std::cout << "add2(5,2) = " << add2(5,2) << std::endl;std::cout << "add4(5,2) = " << add4(5) << std::endl;/*add1(5,2) = 7add2(5,2) = 7add4(5,2) = 15*/
}
6. [[deprecated]]标记
美 [ˈdeprəkeɪtɪd]
vt. 强烈反对,抨击;对……表示不赞成;
/*6. [[deprecated]]标记 ------------*/
//在打算废弃一些接口的时候,可以直接打个标记过渡,然后在后续的版本就可以完全清理掉。
[[deprecated]]
void deprecatedFunc() {//do nothing
}void testDeprecatedFunc() {//warning'deprecatedFunc' is deprecateddeprecatedFunc();
}
7. 库的新特性
/*库的新特性*/
/*7. 新增std::make_unique*/
class A {
public:A(const int a):a_(a){}int getA(){return a_;}
private:int a_;
};
void testMakeUnique() {//新增std::make_uniquestd::unique_ptr<A> pt = std::make_unique<A>(1);std::cout << "pt = " << pt->getA() << std::endl;
}/*2.新增读写锁std::shared_timed_mutex与std::shared_lock*/
//c++11引入了多线程线程的一些库,但是是没有读写锁的,因此在c++14引入了读写锁的相关实现(头文件shared_mutex),其实c++14读写锁也还不够完善,知道c++17读写锁这块才算是完备起来,后面写c++17的时候计划把这块再完整的梳理一下。
/* 当Mutex是shared_mutex 的时候1.当有函数使用共享锁时,能够与其他享有共享锁的函数也能并发同步执行。而和所有独占锁的函数是互斥的。2.当有一个函数使用独占锁时,其他所有的用同一个Mutex带锁的函数都是与其互斥的。
*/
//我理解是这个std::shared_mutex实际上是互斥量,是否是共享锁取决于用std::shared_lock<std::shared_mutex> ,还是std::unique_lock<std::shared_mutex> 还是std::lock_guard<std::shared_mutex>std::shared_mutex g_sMutex;
std::shared_timed_mutex g_shared_m;
void writeTime(const std::string funName ,int time) {for (size_t i = 1; i < time; i++) {std::string outPut = funName + ":" + std::to_string(time);std::cout << outPut << std::endl;sleep(1);}}void shared_1(int seconds) {std::shared_lock<std::shared_timed_mutex> sl(g_shared_m);std::cout << "shared_1" << std::endl;writeTime("shared_1" , seconds);
}void shared_2(int seconds) {std::shared_lock<std::shared_timed_mutex> theLock(g_shared_m);std::cout << "shared_2" << std::endl;writeTime("shared_2", seconds);
}void testSharedMutext() {std::vector<std::thread> vecThrea;vecThrea.push_back(std::thread(shared_1,10));vecThrea.push_back(std::thread(shared_2,10));for (auto & oneThread : vecThrea){oneThread.join();}/*shared_1shared_2shared_2:10shared_1:10shared_2:10shared_1:10shared_2:10shared_1:10shared_1:10shared_2:10shared_1:10shared_2:10shared_1:10shared_2:10shared_1:10shared_2:10shared_2:10shared_1:10shared_2:10shared_1:10*/
}
/*3. 新增std::exchange*/
//c++14新增了一个接口std::exchange(头文件utility),其实这个也并不算是新增的,因为这个接口其实在c++11的时候就有了,只不过在c++11中作为一个内部函数,不暴露给用户使用,在c++14中才把它暴露出来给用户使用。使用方法也很简单。
//exchange会把第二个值赋值给第一个值,但是不会改变第二个值。我们来看下它的实现吧。//自己仿写一个, 除此之外,我们这里说明一个关键的点。exchange的第二个值是万能引用,所以说他是既可以接收左值,也可以接收右值的,所以我们可以这样来使用。
template <typename T, typename U>
T myExchange(T &a, U &&b) {T old_value = std::move(a);a = std::forward<U>(b);return old_value;
}void testExchange() {std::string s1 = "hello";std::string s2 = "world";std::cout << s1 << " " << s2 << std::endl;std::exchange(s1, s2);std::cout << s1 << " " << s2 << std::endl;/*hello worldworld world*/myExchange(s1, s2);std::cout << s1 << " " << s2 << std::endl;myExchange(s1, std::move(s2));std::cout << s1 << "| " << s2 << std::endl;/*hello worldworld worldworld worldworld|*/}/*4. 新增std::quoted英 [kwəʊtid] 美 [ˈkwoʊtɪd]
v. 引证(quote 的过去式)*/
//C++14引入std::quoted用于给字符串添加双引号void testQuoted() {std::string str = "Hello world!";std::cout << str << std::endl;std::cout << std::quoted(str) << std::endl;/*Hello world!"Hello world!"*/
}
相关文章:
面试之快速学习C++14
文章参考:https://zhuanlan.zhihu.com/p/588826142?utm_id0 最近学了一会感慨到找工作好难,上周面试了一家医疗公司,准备攒攒经验但是不去,结果三天了没消息,感觉一面都没过… 本来自傲看不上,结果人家也…...
【算法专题突破】双指针 - 快乐数(3)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:202. 快乐数 - 力扣(Leetcode) 这道题的题目也很容易理解, 看一下题目给的示例就能很容易明白, 但是要注意一个点&#…...
【javaweb】学习日记Day4 - Maven 依赖管理 Web入门
目录 一、Maven入门 - 管理和构建java项目的工具 1、IDEA如何构建Maven项目 2、Maven 坐标 (1)定义 (2)主要组成 3、IDEA如何导入和删除项目 二、Maven - 依赖管理 1、依赖配置 2、依赖传递 (1)查…...
C++信息学奥赛1144:单词翻转
#include <iostream> #include <string> using namespace std; int main() {string str;// 输入一行字符串getline(cin, str);string arr;for (int i 0; i < str.length(); i){if (str[i] ! ){arr str[i]; // 将非空格字符添加到临时存储的字符串中}else{for…...
qt检查文件夹是否有写权限
Qt 使用如下函数能够判断路径或者文件是否可写: bool QFileInfo::isWritable() const 对于win10系统实测,结果不准确。继续排查,官方文档描述:a)如果未启用 NTFS 权限检查,Windows 上的结果将仅反映文件是…...
LSF 安装目录,快速参考 LSF 命令、守护程序、配置文件、日志文件和重要集群配置参数
样本 UNIX 和 Linux 安装目录 守护程序错误日志文件 守护程序错误日志文件存储在 LSF_LOGDIR 在 lsf.conf 文件中定义的目录中。 LSF 基本系统守护程序日志文件LSF 批处理系统守护程序日志文件pim.log.host_namembatchd.log.host_namembatchd.log.host_namesbatchd.log.host_…...
在Mybatis中写动态sql这些标签:if、where、set、trim、foreach、choose的作用是什么,怎么用?
在 MyBatis 中,您可以使用动态 SQL 标签来构建灵活的 SQL 查询,以根据不同的条件生成不同的查询语句。以下是这些标签的作用和用法: 1. **<if> 标签:** 用于根据某个条件动态地包含或排除 SQL 片段,test:可以写…...
7 Python的模块和包
概述 在上一节,我们介绍了Python的异常处理,包括:异常、异常处理、抛出异常、用户自定义异常等内容。在这一节中,我们将介绍Python的模块和包。Python的模块(Module)和包(Package)是…...
【JavaWeb 篇】使用Servlet、JdbcTemplate和Durid连接池实现用户登录功能与测试
在现代Web应用程序开发中,用户登录功能是基础中的基础。它为用户提供了安全访问系统的途径。本篇博客将引导您通过使用Servlet、Spring框架的JdbcTemplate以及Durid连接池,来构建一个完整的用户登录功能。我们将详细展示每个部分的代码,并解释…...
【Unity3D赛车游戏】【六】如何在Unity中为汽车添加发动机和手动挡变速?
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
【Go 基础篇】切片:Go语言中的灵活数据结构
在Go语言中,切片(Slice)是一种强大且灵活的数据结构,用于管理和操作一系列元素。与数组相比,切片的大小可以动态调整,这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入,介…...
龙芯2K1000LA移植交叉编译环境以及QT
嵌入式大赛结束了,根据这次比赛中记的凌乱的笔记,整理了一份龙芯2K1000LA的环境搭建过程,可能笔记缺少了一部分步骤或者错误,但是大致步骤可以当作参考。 一、交叉编译工具链 下载连接:龙芯 GNU 编译工具链 | 龙芯开…...
javaee spring依赖注入之spel方式
spring依赖注入之spel方式 <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.18.RELEASE</version></dependency>package com.test.pojo;import java.util.List; …...
【Java集合学习1】ArrayList集合学习及集合概述分析
JavaArrayList集合学习及集合学习概述 一、Java集合概述 Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Col…...
TouchGFX之调试
DebugPrinter类是一种在显示屏上打印调试消息的简单方法,无需向屏幕添加控件。 在使用DebugPrinter之前,需要分配一个实例并将其传递给Application类,且DebugPrinter实例必须兼容所使用的LCD类。 该表列出了DebugPrinter类名称: …...
C# winform加载yolov8模型测试(附例程)
第一步:在NuGet中下载Yolov8.Net 第二步:引用 using Yolov8Net; 第三步:加载模型 private IPredictor yolov8 YoloV8Predictor.Create("D:\\0MyWork\\Learn\\vs2022\\yolov_onnx\\best.onnx", mylabel); 第四步:图…...
浙大陈越何钦铭数据结构07-图6 旅游规划
题目: 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入…...
VUE笔记(七)项目登录
1、安装elementui 在终端执行 vue add element 注册组件 如果要使用哪个组件,大家需要在plugins/element.js中注册该组件 import Vue from vue import { Button } from element-ui Vue.use(Button) 在页面组件中使用 <el-button type"primary"&…...
大语言模型之六- LLM之企业私有化部署
数据安全是每个公司不得不慎重对待的,为了提高生产力,降本增效又不得不接受新技术带来的工具,私有化部署对于公司还是非常有吸引力的。大语言模型这一工具结合公司的数据可以大大提高公司生产率。 私有化LLM需要处理的问题 企业内私有化LLM…...
Python3 列表
Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。 Python 有 6 个序列的内置类型,但最常见的是列表和元组。 列表都可以进…...
OpenCV基础知识(8)— 图形检测
前言:Hello大家好,我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,例如搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线、…...
Java虚拟机
文章目录 JVM运行时数据区域HotSpot虚拟机对象探秘实战:OutOfMemoryError异常 JVM 运行时数据区域 HotSpot虚拟机对象探秘 实战:OutOfMemoryError异常...
c++学习 之 函数重载注意事项
文章目录 引用作为函数重载的条件函数重载遇到默认参数 引用作为函数重载的条件 #include <iostream> using namespace std; void fun(int &a) {cout << "void fun(int & a)" << endl; }void fun(const int &a) {cout << "…...
2023-08-27 LeetCode每日一题(合并区间)
2023-08-27每日一题 一、题目编号 56. 合并区间二、题目链接 点击跳转到题目位置 三、题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组&#…...
C#,数值计算——调适数值积分法(adaptive quadrature)的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 调适数值积分法 /// adaptive quadrature /// </summary> public class Adapt { private double x1 { get; } 0.942882415695480; private …...
微信小程序发布迭代版本后如何提示用户强制更新新版本
在点击小程序发布的时候选择,升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal...
星际争霸之小霸王之小蜜蜂(七)--消失的子弹
目录 前言 一、删除子弹 二、限制子弹数量 三、继续重构代码 总结 前言 昨天我们已经让子弹飞了起来,但是会面临一个和之前小蜜蜂一样的问题,小蜜蜂的行动应该限制在窗口内,那么子弹也是有相同之处,也需要限制一个移动范围&…...
Hadoop入门机安装hadoop
0目录 1.Hadoop入门 2.linux安装hadoop 1.Hadoop入门 定义 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 优势 高可靠性:Hadoop底层维护多…...
cookie技术介绍
title: cookie技术 date: 2023-08-27 21:34:19 tags: [cookie, 网络, http] categories: 网络 我们经常说的cookie缓存数据,允许cookie是什么意思? Cookie也被称作Cookies,它是一种让网站的服务器端可以把少量数据存储在客户端的硬盘或内存中&#x…...
网络摄像头:SparkoCam Crack
SparkoCam 网络摄像头软件 SparkoCam 是一款网络摄像头和视频效果软件,用于广播实时网络摄像头效果并将其应用到视频聊天和录音中。 使用佳能/尼康数码单反相机作为常规网络摄像头通过向实时视频聊天和视频录制添加酷炫的网络摄像头效果和图形来增强 USB 网络摄像…...
中国建筑公司网站/seo薪资seo
我正在尝试将Spring上下文中定义的bean注入CDI托管组件,但我没有成功.不注入bean,而是每次执行注入时都会创建一个新实例.我的环境是使用JBoss Weld的Tomcat 7.Spring ApplicationContext是直截了当的:......CDI托管bean看起来像这样:javax.inject.Named…...
网站建设 面试问题/seo搜索引擎优化工资多少钱
sso-shiro-casspring下使用shirocas配置单点登录,多个系统之间的访问,每次只需要登录一次,项目源码系统模块说明cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已doc: 文档目录,里面有…...
网站超链接怎么做 word文档/百度推广代理公司哪家好
1 介绍 1.1 实现流程 让左边排好序让右边排好序合并后整体排好序 1.2 特点 时间复杂度O(nlogn)空间复杂度O(n)稳定 2 实现 2.1 递归 public class MergeSort {public static void mergeSort(int[] arr) {if (arr null || arr.length < 2) {return;}process(arr, 0,…...
wordpress安装伪静态/万能浏览器
Aster(A*)算法 Aster算法是在Dijkstra算法基础上发展出来的,是在静态路径中用于求解最优路径有效的直接搜索算法,比dijkstra算法多了一个启发式的搜索函数,也就是通过一个代价函数来确定搜索方向(从起点开…...
河南建设监理协会官方网站/怎么查询搜索关键词
摘要: Linux shell/terminal 命令非常强大即使一个简单的命令就可能导致文件夹、文件或者路径文件夹等被删除。 在一些情况下Linux 甚至不会询问你而直接执行命令导致你丢失各种数据信息。 一般来说在 Web 上推荐新的 Linux 用户执行这些命令当然也有人哪些写过这代…...
新乡网站建设公司黄页/discuz论坛seo设置
[转载自博客](http://blog.csdn.net/huang_wei_cai/article/details/52515817) 前言: Android Studio中对一个自己库进行生成操作时将会同时生成.jar与.aar文件。如下是本人测试可行的方案,需要学习的可以参考。 分别存储位置: *.jar&#x…...