![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++ tips
文章平均质量分 54
暮雨林钟
人生何处不青山
展开
-
C/C++ Lambda表达式概述
基本概述: 关于Lambda表达式之前接触过,但是没有系统总结过,这里整一个基础版的总结; 关于lambda表达式,可以看作三种函数调用形式的最高级别; 之前接触过:函数指针、仿函数; lambda可以看作仿函数的升级版; 例如其他blog举例: class Plus { public: int operator()(int a, int b) { return a + b; } }; 相比于函数指针,更容易在类内保留信息和状态,并且调用和函数类似,原因是重载了"()"操作符: P原创 2022-05-07 11:46:53 · 506 阅读 · 0 评论 -
C/C++ 关于enable_if及重载选择的问题
遇到了enable_if问题以及相关的概念,这里做一下总结; 基本概念: enable_if主要的作用是模板类型推导,用于选择重载的版本; 这里先说一下SFINAE,因为enable_if所用的也是SFINAE特性; 1.SFINAE概念: 全称为:Sbusitution Failure Is Not An Error; 用人话说的意思就是,如果有多个重载函数,不能匹配的重载函数看作删除,而不作为错误; 在重载时,会先利用该参数进行所有候选函数的推导,来得到一个完美的匹配; 但是对于不能匹配的无效模板参数,原创 2022-04-28 16:16:23 · 662 阅读 · 0 评论 -
C/C++ 关于刷题中字符分割的问题
之前遇到过,但是一直没有拿出来说一说; C++并没有所谓的split函数,因此最多的方法是借助istringstream来进行分割; 1.空格分割: 对于空格分割的string,可以直接采用以下: 直接用>>输入即可; TreeNode* fun(istringstream& ss){ string s; ss>>s; if(s=="null") return nullptr; T原创 2022-04-19 21:29:58 · 526 阅读 · 0 评论 -
C/C++ move/forward/完美转发
本节针对于std::move,std::forward,左右引用做一个基本得归纳和整理; 一、为什么需要: 之所以需要说白了还是在构造对象的性能优化上; 针对于构造方式,无非是:深拷贝,浅拷贝 两种; 所以一般而言,对象内部应该实现两种构造函数,移动构造函数和拷贝构造函数; 前者用于直接转让内部对象,避免复制耗时,而后者主要是直接进行全量复制; 例如下例: class A { public: A() { cout << "construct.." << end原创 2022-04-01 16:37:58 · 562 阅读 · 0 评论 -
C/C++ tuple的一些问题
tuple基本介绍: 可以看作类似于python的一个元组,内部可以包含多个不同类型的元素; 但是由于Cpp的强声明特性,要求必须要在初始化时进行内容物类型声明; std::tuple<T1, T2, TN> t1; //创建一个空的tuple对象(使用默认构造),它对应的元素分别是T1和T2...Tn类型,采用值初始化。 std::tuple<T1, T2, TN> t2(v1, v2, ... TN); //创建一个tuple对象,它的两个元素分别原创 2022-03-23 15:52:57 · 2038 阅读 · 0 评论 -
C/C++ 关于复杂型别推导问题
右左法则: 法则论述:从变量名看起,先往右,再往左,碰到圆括号就调转阅读的方向;括号内分析完就跳出括号,还是先右后左的顺序。如此循环,直到分析完整个定义。 一般来说结合的规律有以下几条: typedef (*var)(...); // 变量名var与*结合,被圆括号括起来,右边是参数列表。表明这是函数指针 typedef (*var)[]; //变量名var与*结合,被圆括号括起来,右边是[]运算符。表示这是数组指针 typedef (*var[])...;// 变量名var先与[]结合,说明这是一个数组原创 2022-03-22 14:48:12 · 318 阅读 · 0 评论 -
C/C++ 关于size_t遍历倒序的问题
之前自己参照Effective Modern C++的思想,想用auto代替遍历,发现逆序的时候会有问题; 对于逆序常规便利,会因为size_t为无符号数,0-1后并不是-1,而是新的无符号数,发生下溢,因此无法通过常规方式遍历; 网上老哥有两种方案: 1.使用n作为起始遍历索引: 这里就能保证直接访问到0元素,巧妙的避开了下溢问题; vector<int>vec(4, 4); for (auto i = vec.size(); i-- > 0;) { cout << vec原创 2022-03-10 14:47:31 · 658 阅读 · 0 评论 -
C/C++ 关于左右值的问题
以前记得学过,后来又忘了,现在做一个总结; 一、左右值基本定义: 简而言之,左值就是指那些拥有地址,在存储单元内存储数值的变量,可以通过变量名去访问; 而右值这事中间的临时变量,无法通过地址进行访问,表达式或者生存周期结束之后就被彻底销毁; 这里右值还分为两种: 1.纯右值:非引用返回的临时变量( int func(void) )、运算表达式产生的临时变量(b+c)、原始字面量(2)、lambda表达式等; 2.将亡值:将要被移动的对象、T&&函数返回值、std::move返回值和转换为T&原创 2022-03-04 19:35:09 · 431 阅读 · 0 评论