C++11/14
RBLT
say it,do it,be it
展开
-
c++模板类链表(模板结构体,模板类,运算符重载)
一、存放数据的结构体首先需要自定义一个存放数据的结构体模板,假定结构体中需要存放的数据类型有int,double,char和任意类型的数组,因此就有template <typename U>struct LNode { int a; double b; char c; U* array;};考虑到结构体内有数组,在之后初始化的工作和查找数据的时候需要重新写循环,因此在结构体中重载赋值和等于运算符。void operator= (const U a)const { int原创 2021-02-09 20:41:24 · 943 阅读 · 0 评论 -
常用C++11特性
详细介绍:C++11/14 高速上手教程一、右值引用与std::move如下代码:std::string tmp("bert")std::string name(tmp)第一行声明了一个对象tmp,用"bert"字符串进行初始化第二行声明了一个对象name,使用参数tmp调用string的构造函数,因此对象name复制了"bert"的一个副本,如下:如下代码:std::stri...原创 2019-08-02 13:42:18 · 276 阅读 · 0 评论 -
C++11/14介绍(四)——新增容器(一)
一、std::arraystd::array会在编译时创建一个固定大小的数组,std::array不能够被隐式的转换成指针,使用std::array很简单,只需指定其类型和大小即可:std::array<int, 4> arr= {1,2,3,4};int len = 4;std::array<int, len> arr = {1,2,3,4}; // 非法, 数...原创 2019-08-07 15:15:39 · 572 阅读 · 0 评论 -
C++11/14介绍(四)——新增容器(二)
无序容器传统 C++ 中的有序容器 std::map/std::set,这些容器内部通过红黑树进行实现,插入和搜索的平均复杂度均为 O(log(size))。在插入元素时候,会根据 < 操作符比较元素大小并判断元素是否相同,并选择合适的位置插入到容器中。当对这个容器中的元素进行遍历时,输出结果会按照 < 操作符的顺序来逐个遍历。而无序容器中的元素是不进行排序的,内部通过 Hash ...原创 2019-08-07 15:24:28 · 384 阅读 · 0 评论 -
C++11/14介绍(四)——新增容器(三)
一、元组std::tuple传统C++中的容器,除了std::pair外,没有现成的数据结构能用来存放不同类型的数据,但是std::pair的缺陷是只能保存;两个元素。二、元组基本操作元组的使用有三个核心的函数:std::make_tuple:构造元组std::get:获得元组某个位置的值std::tie:元组拆包//在C++14下运行#include <tuple>...原创 2019-08-07 15:47:05 · 359 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(四)
std::weak_ptr#include <iostream>#include <memory>class A;class B;class A {public: std::shared_ptr<B> pointer; ~A() { std::cout << "A 被销毁" << std::...原创 2019-08-09 17:21:19 · 291 阅读 · 0 评论 -
C++11/14介绍(六)——正则表达式库(一)
正则表达式简介正则表达式描述了一种字符串匹配的模式,一般使用正则表达式主要是实现下面三个需求:检查一个串是否包含某种形式的子串将匹配的子串替换从某个串中取出符合条件的子串正则表达式是由普通字符(例如 a 到 z)以及特殊字符组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。一、普通字符普通字符包括没有显式...原创 2019-08-09 17:43:09 · 984 阅读 · 0 评论 -
C++11/14介绍(六)——正则表达式库(二)
std::regex及其相关对字符串内容进行匹配的最常见手段就是使用正则表达式。可惜在传统 C++ 中正则表达式一直没有得到语言层面的支持,没有纳入标准库,而 C++ 作为一门高性能语言,在后台服务的开发中,对 URL 资源链接进行判断时,使用正则表达式也是工业界最为成熟的普遍做法。一般的解决方案就是使用 boost 的正则表达式库。而 C++11 正式将正则表达式的的处理方法纳入标准库的行列...原创 2019-08-09 17:53:48 · 451 阅读 · 0 评论 -
C++11/14介绍(七)——语言级线程支持(一)
std::threadstd::thread 用于创建一个执行的线程实例,所以它是一切并发编程的基础,使用时需要包含头文件,它提供了很多基本的线程操作,例如get_id()来获取所创建线程的线程 ID,例如使用 join() 来加入一个线程等等,例如:#include <iostream>#include <thread>void foo() { std::...原创 2019-08-09 17:58:17 · 412 阅读 · 0 评论 -
C++11/14介绍(七)——语言级线程支持(二)
std::mutex, std::unique_lockC++11引入了 mutex 相关的类,其所有相关的函数都放在 <mutex> 头文件中。std::mutex 是 C++11 中最基本的 mutex 类,通过实例化 std::mutex 可以创建互斥量,而通过其成员函数 lock() 可以仅此能上锁,unlock() 可以进行解锁。但是在在实际编写代码的过程中,最好不去直接...原创 2019-08-09 18:09:51 · 434 阅读 · 0 评论 -
C++11/14介绍(八)——其他杂项
一、新类型long long int 并不是 C++11 最先引入的,其实早在 C99,long long int 就已经被纳入 C 标准中,所以大部分的编译器早已支持。C++11 的工作则是正式把它纳入标准库,规定了一个 long long int 类型至少具备 64 位的比特数。二、noexcept 的修饰和操作C++ 相比于 C 的一大优势就在于 C++ 本身就定义了一套完整的异常处理...原创 2019-08-09 18:22:32 · 323 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(一)
引用计数这种计数是为了防止内存泄露而产生的。基本想法是对于动态分配的对象,进行引用计数,每当增加一次对同一个对象的引用,那么引用对象的引用计数就会增加一次,每删除一次引用,引用计数就会减一,当一个对象的引用计数减为零时,就自动删除指向的堆内存。在传统 C++ 中,『记得』手动释放资源,总不是最佳实践。因为我们很有可能就忘记了去释放资源而导致泄露。所以通常的做法是对于一个对象而言,在构造函数的时候...原创 2019-08-07 18:35:25 · 581 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(三)
std::unique_ptrstd::unique_ptr 是一种独占的智能指针,它禁止其他智能指针与其共享同一个对象,从而保证了代码的安全:std::unique_ptr<int> pointer = std::make_unique<int>(10); // make_unique 从 C++14 引入std::unique_ptr<int> p...原创 2019-08-08 19:00:45 · 324 阅读 · 0 评论 -
C++11/14介绍(五)——智能指针和引用计数(二)
std::shared_ptrstd::shared_ptr是一种智能指针,它能够记录多少个shared_ptr共同指向一个对象,从而消除显式的调用delete,当引用计数变为0时,就会将对象删除。std::make_shared能够用来显式的使用new,所以std::make_shared会分配创建传入参数中的对象,并返回这个对象类型的std::shared_ptr指针,ex:#inclu...原创 2019-08-08 18:00:21 · 418 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(一)
nullptr与constexpr一、nullptrnullptr的出现是为了替代NULLC++98中,NULL和0是不做区分的,导致以下程序void foo(char *a){ cout<<"String";}void foo(int a){ cout<<"Number";}int main(){ char *ch ...原创 2019-07-02 17:27:12 · 380 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(二)
类型推导在传统C/C++中,任何参数的类型都必须明确定义,这会使开发效率变慢,而且让代码变得冗长C++11引入了auto和decltype实现了类型推导一、auto使用auto进行类型推导的一个最为常见而且显著的例子就是迭代器,以前需要这样写:for(vector<int>::const_iterator itr = vec.cbegin(); itr != vec....原创 2019-07-03 09:07:09 · 314 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(三)
区间迭代C++11 引入了基于范围的迭代写法,我们拥有了能够写出像 Python 一样简洁的循环语句:int array[] = {1,2,3,4,5};for(auto &x : array) { std::cout << x << std::endl;}常用的vector数组遍历:std::vector<int> arr...原创 2019-07-03 09:11:56 · 257 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(四)
初始化列表提起初始化列表,首先想到的是类的构造函数的初始化列表:class test{private: int x,y;public: test(int a,int b):x(a),y(b){}};int main(){ test a(2,4); return 0;}如果是一个列表需要初始化,则可以这样写:class test{pr...原创 2019-07-03 09:35:01 · 242 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(五)
模板增强一、外部模板传统 C++ 中,模板只有在使用时才会被编译器实例化。换句话说,只要在每个编译单元(文件)中编译的代码中遇到了被完整定义的模板,都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且,我们没有办法通知编译器不要触发模板实例化。C++11 引入了外部模板,扩充了原来的强制编译器在特定位置实例化模板的语法,使得能够显式的告诉编译器何时进行模板的实例化:temp...原创 2019-07-03 16:34:02 · 324 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(六)
面向对象增强一、委托构造C++11 引入了委托构造的概念,这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数,从而达到简化代码的目的class Base {public: int value1; int value2; Base() { value1 = 1; } Base(int value) : Base() { ...原创 2019-07-03 16:58:20 · 283 阅读 · 0 评论 -
C++11/14介绍(二)——语言可用性的强化(七)
强类型枚举在传统 C++中,枚举类型并非类型安全,枚举类型会被视作整数,则会让两种完全不同的枚举类型可以进行直接的比较(虽然编译器给出了检查,但并非所有),甚至枚举类型的枚举值名字不能相同,这不是我们希望看到的结果。C++11 引入了枚举类(enumaration class),并使用 enum class 的语法进行声明:enum class new_enum : unsigned...原创 2019-07-03 17:11:03 · 247 阅读 · 0 评论 -
C++11/14介绍(三)——语言运行期的强化(一)
Lambda表达式lambda表达式的基本语法如下:[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型{ //函数体}捕获列表可以理解为参数的一种类型,lambda表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。根据传递的行为,捕获列表分为以下几种。值捕获void learn_lamb...原创 2019-07-05 15:46:11 · 396 阅读 · 0 评论 -
C++11/14 高速上手教程
目录1、弃用特性和与C语言的兼容性2、语言可用性的强化2.1、nullptr与constexpr2.2、类型推导2.3、区间迭代2.4、初始化列表### 2.5、模板增强2.6、面向对象增强2.7、强类型枚举3、语言运行期的强化3.1、lambda表达式...原创 2019-07-05 16:02:32 · 1132 阅读 · 0 评论 -
C++11/14介绍(三)——语言运行期的强化(二)
函数对象包装器一、std::functionLambda表达式的本质是一个函数对象,当lambda表达式的捕获列表为空时,Lambda表达式还能作为一个函数指针进行传递:#include <iostream>using foo = void (int);void functional(foo f){ f(1);}int main(){ auto f...原创 2019-08-01 14:36:51 · 264 阅读 · 0 评论 -
C++11/14介绍(三)——语言运行期的强化(三)
右值引用一、左值,右值的纯右值、将亡值,右值左值:赋值符号左边的值。左值是表达式后依然存在的持久对象右值:右边的值。指表达式结束后就不在存在的临时对象,C++11中为了引入强大的右值引用,将右值的概念进行了进一步的划分,分为纯右值:纯粹的右值,要么是纯粹的字面量,ex:10,true;要么是求值结果相当于字面量或匿名临时对象,ex:1+2。非引用返回的临时变量、运算表达式...原创 2019-08-01 21:19:28 · 376 阅读 · 0 评论 -
C++11/14介绍(一)——弃用特性和与C语言的兼容性
C++11/14介绍(一)一、弃用特性如果一个类有析构函数,为其生成拷贝构造函数和拷贝赋值运算符的特性被弃用了class test{public: test(){} ~test(){}};int main(){ test A; test B(A); test C = A; return 0;}C++98 异常说明、 un...原创 2019-07-01 17:21:50 · 2043 阅读 · 0 评论