cpp11
文章平均质量分 58
另寻沧海
这个作者很懒,什么都没留下…
展开
-
C++ 11 & 14 中的Lambda表达式 补充
lambda的本质原创 2022-08-21 17:26:31 · 264 阅读 · 0 评论 -
std::boolalpha
1.头文件#include <iostream>2.使用说明让输出流将bool解析成为true或者 false3、示例代码#include <iostream>void test_boolalpha(){ std::cout << "true is " << true << std::endl; std::cout << "false is " << false << std::endl;原创 2022-05-16 17:26:55 · 463 阅读 · 0 评论 -
函数名作为字符串输出(Function Names as Strings)
GCC 预定义了两个标识符来保存当前函数的名称。 标识符 __FUNCTION__ 包含函数在源代码中出现的名称。 标识符 __PRETTY_FUNCTION__ 包含以特定语言方式漂亮打印的函数名称。https://www.onlinegdb.com/ online gdb 验证这些名称在 C 函数中始终相同,但在 C++ 函数中它们可能不同。 例如,这个程序:#include <stdio.h>void test_macroFunction(int i, int j){原创 2022-05-16 17:16:46 · 356 阅读 · 0 评论 -
使用C++11解决内存泄露--智能指针
C++11提供了智能指针,使用智能指针后不需要用户自己释放内存空间,一旦使用时对象超出了自己的生命周期,就会进行自动释放,从而有效解决了内存泄露的问题。在实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptr和std::weak_ptr。1 共享智能指针:std::shared_ptrstd::share_ptr指针的每一个拷贝都指向同一个对象,只有在引用计数为零时内存才会被释放。指针声明原型为:template class shared_pt原创 2022-03-25 10:45:18 · 1154 阅读 · 0 评论 -
常量表达式值 constexpr
常量表达式值(constant-expression value)。通常情况下,常量表达式值必须被一个常量表达式赋值,而跟常量表达式函数一样,常量表达式值在使用前必须被初始化。一、常量表达式1.1 运行时常量性与编译时常量性在C++中,我们常常会遇到常量的概念。常量表示该值不可修改,通常是通过const关键字来修饰的。比如:const int i = 3;const还可以修饰函数参数、函数返回值、函数本身、类等。在不同的使用条件下,const有不同的意义,不过大多数情况下,const描述的都原创 2022-03-24 17:08:23 · 1677 阅读 · 0 评论 -
C++基础之元编程与constexpr
元编程(metaprogramming)是一个典型的复合词,他由前缀 meta- 和词根 programming 复合而成,有“对一个程序进行编程”的意思。换句话说,编译器先编译你的代码,得到一份新的代码,然后再编译新的代码来解决问题。模板元编程技术,即把一些可以在编译时完成的求值计算,通过模板特化的技术绑定到具体的实例化代码上,从而减少不必要的代码量,提升代码的运行效率。一、C++的元编程1.1 为什么要元编程呢?前面我们知道了什么是元编程,那么为什么要有这种编写技巧呢?无外乎两点:减少重复的代原创 2022-03-24 14:16:48 · 2595 阅读 · 1 评论 -
模板偏特化 Partial specialization
偏特化是指如果一个 class template 拥有一个以上的 template 参数,我们可以针对其中某个(或多个,但不是全部)template 参数进行特化,比如下面这个例子template <typename T>class C {...}; //此泛化版本的 T 可以是任何类型template <typename T>class C<T*> {...}; //特化版本,仅仅适用于 T 为“原生指针”的情况,是泛化版本的限制版所谓特化,就是特殊情原创 2022-03-23 18:42:20 · 773 阅读 · 0 评论 -
std::vector
#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ vector<int> v {1, 2, 3, 2, 5, 2, 6, 2, 4, 8}; const auto new_end (remove(begin(v), end(v), 2)); v.erase(new_end, end(v));原创 2022-03-17 17:37:17 · 504 阅读 · 0 评论 -
循环遍历map容器,erase元素的问题
#include <iostream>#include <map>using namespace std;int main(){ map<string,string> testMap{ {"cpp","cpppp"}, {"java","javaaaa"}, {"shell","shelllll"}, {"python", "pythonnnn"} }; map<st原创 2022-03-14 16:45:19 · 617 阅读 · 0 评论 -
c++11中 std::ref() 和 引用 &
使用std::ref可以在模板传参的时候传入引用,否则无法传递&是类型说明符, std::ref 是一个函数,返回 std::reference_wrapper(类似于指针)用std::ref 是考虑到c++11中的函数式编程,如 std::bind.C++11的设计者认为bind默认应该采用拷贝,如果使用者有需求,加上std::ref()即可。同理std::thread也是这样。example:#include <functional>#include <iostre原创 2022-03-11 15:58:46 · 636 阅读 · 0 评论 -
基于范围的for循环(range-based for statement)
cpp 11 支持基于范围的for循环for (del : coll){ statement}coll 里的内容会被逐个赋值给delvector<double> vec;...//拷贝赋值for (auto elem : vec){ cout<< elem << endl;}//引用传递for (auto elem& : vec){ elem *= 3;}第一种写法是拷贝赋值,修改elem并不会修改vec里的元素, 如果想要原创 2022-03-06 16:15:36 · 181 阅读 · 0 评论 -
C++11 decltype表达式
decltype在某些情况下,不需要或者不能定义变量,但是希望得到某种类型,这时候就可以使用 C++11 提供的 decltype 关键字了,它的作用是在编译器编译的时候推导出一个表达式的类型,语法格式如下:C++ decltype (表达式)decltype 是 “declare type” 的缩写,意思是 “声明类型”。decltype 的推导是在编译期完成的,它只是用于表达式类型的推导,并不会计算表达式的值。来看一组简单的例子:int a = 10;decltype(a) b = 99;原创 2021-08-08 10:34:24 · 1049 阅读 · 0 评论 -
C++11 auto
在 C++11 中增加了很多新的特性,比如可以使用 auto 自动推导变量的类型,还能够结合 decltype 来表示函数的返回值。使用新的特性可以让我们写出更加简洁,更加现代的代码。auto在 C++11 之前 auto 和 static 是对应的,表示变量是自动存储的,但是非 static 的局部变量默认都是自动存储的,因此这个关键字变得非常鸡肋,在 C++11 中他们赋予了新的含义,使用这个关键字能够像别的语言一样自动推导出变量的实际类型。1.1 推导规则C++11 中 auto 并不代表一种原创 2021-08-08 09:46:59 · 656 阅读 · 0 评论 -
C++11 继承构造函数
继承构造函数C++11 中提供的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派生类构造函数的编写。先来看没有继承构造函数之前的处理方式:#include <iostream>#include <string>using namespace std;class Base{public: Base(int i) :m_i(i) {} Base(int i, double j) :原创 2021-08-07 19:33:13 · 227 阅读 · 0 评论 -
C++11 委托构造函数
委托构造函数委托构造函数允许使用同一个类中的一个构造函数调用其它的构造函数,从而简化相关变量的初始化。下面举例说明:#include <iostream>using namespace std;class Test{public: Test() {}; Test(int max) { this->m_max = max > 0 ? max : 100; } Test(int max, int min) {原创 2021-08-07 19:23:34 · 187 阅读 · 0 评论 -
C++ 11 & 14 中的Lambda表达式
auto func = [capture] (params) opt -> ret { func_body; };[捕获列表] (形参列表) mutable 异常列表-> 返回类型{ 函数体 }捕获列表:定义lambda函数所在的作用域中的指定变量可以在lambda函数中使用其中func是可以当作lambda表达式的名字,作为一个函数使用,capture是捕获列表,params是参数表,opt是函数选项(mutable之类), ret是返回值类型,func_body是函数体。各项的含义:原创 2021-07-28 21:04:08 · 393 阅读 · 0 评论 -
c++11原始字面量
在 C++11 中添加了定义原始字符串的字面量,**定义方式为:R “xxx(原始字符串)xxx” 其中()两边的字符串可以省略。**原始字面量 R 可以直接表示字符串的实际含义,而不需要额外对字符串做转译或连接等操作。注意:在R “xxx(raw string)xxx” 中,原始字符串必须用括号()括起来,括号的前后可以加其他字符串,所加的字符串会被忽略,并且加的字符串必须在括号两边同时出现。#include<iostream>#include<string>using n原创 2021-04-06 20:26:07 · 284 阅读 · 0 评论 -
C++11 using 语法
using 语法和 typedef 一样,并不会创建出新的类型,它们只是给某些类型定义了新的别名。using 相较于 typedef 的优势在于定义函数指针别名时看起来更加直观,并且可以给模板定义别名。在 C++ 中 using 用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。在 C++11 中赋予了 using 新的功能,让 C++ 变得更年轻,更灵活。1. 定义别名在 C++ 中可以通过 typedef 重定义一个类型,语法格式如原创 2021-08-07 19:08:48 · 1081 阅读 · 1 评论 -
C++11 final和override
C++ 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。修饰函数如果使用 final 修饰函数,只能修饰虚函数,这样就能阻止子类重写父类的这个函数了:#include <iostream>using namespace std;class Base{public: virtual void test() { cout <原创 2021-08-07 11:39:20 · 277 阅读 · 0 评论