
c++11/17
文章平均质量分 63
介绍c++11/17的一些语法功能
却道天凉_好个秋
这个作者很懒,什么都没留下…
展开
-
c++11总结26——std::regex
功能使用方法完全匹配搜索字符串替换字符串遍历所有匹配推荐简单匹配:直接用std::regex。老版本 C++(C++98/C++03):使用。高性能需求:使用PCRE。原创 2025-02-06 23:19:28 · 448 阅读 · 0 评论 -
c++ c++11之后的std::vector
本文主要介绍c++11之后std::vector的增强与特点。原创 2024-12-08 21:44:02 · 355 阅读 · 0 评论 -
c++ unordered_set和unordered_map
和是高效的容器,适合用于频繁查找、插入和删除操作的场景。适用于集合操作,适用于键值对操作。原创 2024-11-24 22:48:02 · 860 阅读 · 0 评论 -
c++ std::next总结
函数功能修改原始迭代器返回新迭代器std::next将迭代器向前移动n步否是std::prev将迭代器向后移动n步否是将迭代器向前或向后移动n步是否便捷获取目标位置的迭代器:无需手动调用迭代器的递增操作。与算法配合使用:例如在std::find或等算法中定位迭代器。安全性:不直接修改原始迭代器,提高代码的清晰度和可读性。原创 2024-11-22 22:12:44 · 512 阅读 · 0 评论 -
c++ LRU(最近最少使用)缓存机制
【代码】c++ LRU(最近最少使用)缓存机制。原创 2023-11-22 21:22:11 · 204 阅读 · 0 评论 -
c++ 获取当前时间(精确至秒、毫秒和微妙)
表示时间的持续时间(Duration)原创 2023-11-20 22:32:33 · 8880 阅读 · 0 评论 -
c++17 transform_reduce的使用
/ c++17起// c++17起// c++17起// c++17起// c++17起// c++17起// c++17起// c++17起// c++17起// c++17起// c++17起。原创 2023-09-02 12:42:38 · 1311 阅读 · 0 评论 -
c++ 递归锁的使用
同一个线程里,在锁未释放的情况下反复加锁,会导致死锁。发现程序卡住不动,无Func函数中的打印。原创 2023-08-09 21:15:03 · 749 阅读 · 0 评论 -
c++11总结25——reverse_copy
1. 功能将src[begin,end)内的元素复制到"以dst起始的目标区间",并在复制过程中将元素倒序插入。2. 源码分析将原容器中的元素反序插入目的容器。template <class _BidIt, class _OutIt>_CONSTEXPR20 _OutIt reverse_copy(_BidIt _First, _BidIt _Last, _OutIt _Dest) { // copy reversing elements in [_First, _L原创 2022-04-06 20:12:12 · 673 阅读 · 0 评论 -
c++11总结24——emplace_back
问题引入拿std::deque的push_back举例,其源码如下:public: // push_* and pop_* void push_back(const value_type& t) { if (finish.cur != finish.last - 1){ // 最后缓冲区尚有一个以上的备用空间 construct(finish.cur, t); //直接在备用空间上构造元素 ++原创 2022-03-31 20:30:13 · 1926 阅读 · 0 评论 -
c++11总结23——CAS(无锁队列)
1. 概念CAS(Compare And Swap)操作是一条CPU的原子指令,所以不会有线程安全问题。伪代码实现:CAS(addr,old,new)解释:将addr存放的只与old比较,如果等于old,则将new赋值给addr。c++代码实现://输入一个pAddr的地址,在函数内部判断其的值是否与期望值nExpected相等//如果相等那么就将pAddr的值改为nNew并同时返回true;否则就返回false,什么都不做 bool compare_and_swap(in原创 2021-08-25 22:14:43 · 6501 阅读 · 2 评论 -
c++11总结22——原子操作与memory_order
1. 原子操作1.1 概念原子操作时多线程程序中"最小且不可并行化"的操作。通常对一个共享资源的操作是原子操作的话,意味着多个线程访问该资源时,有且仅有唯一一个线程在对这个资源进行操作。通常情况下,原子操作通过"互斥"(mutual exclusive)的访问来保证。实现互斥通常需要平台相关的特殊指令,在c++11标准之前,这常常意味着需要在c/c++代码中嵌入内联汇编代码。1.2 存在的问题来看一个具体的例子(例1):#include <pthread.h>#inc原创 2021-07-11 21:50:58 · 1072 阅读 · 2 评论 -
c++11总结21——atomic_flag
1. 头文件#include <atomic>2. 功能是原子布尔类型,它保证是无锁的(lock-free),且不提供加载或存储操作。3. 成员函数构造函数 atomic_flag() noexcept = default; atomic_flag (const atomic_flag&T) = delete; operator=is deleted (non-copyable/moveable) 说明:拷贝构造函数和赋值函数被.原创 2021-07-09 22:16:42 · 495 阅读 · 2 评论 -
c++11总结20——constexpr
1. 概念c++11引入的关键字,用于编译时获取常量或常量函数的结果。constexpr修饰普通变量时,变量必须经过初始化且初始值必须是一个常量表达式。2. c++11限制c++11之前的常量表达式不允许包含函数调用或对象构造,如下所示:int rValue() { return 1;}int m_iValue[rValue() + 2]; //c++03中errorc++11引入关键字constexpr,允许编程者保证函数或对象的构造函数是编译时常量,代码改写如下原创 2021-07-08 22:56:06 · 798 阅读 · 2 评论 -
c++11总结19——std::mutex
1. 头文件#include <mutex>2. 分类std::mutex——最基本的mutex类 std::recursive_mutex——递归mutex类 std::time_mutex——定时mutex类 std::recursive_timed_mutex——定时递归mutex类3. std::mutex3.1 概念std::mutex 是C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即非递归锁,而 std::recurs原创 2021-07-05 20:13:31 · 845 阅读 · 3 评论 -
c++11总结18——std::to_string
1. 概念std::to_string是c++11之后提供的转字符串函数,定义在头文件中。2. 类型std::string to_string( int value ); //与 std::sprintf(buf, "%d", value)在有足够大的 buf 时产生的内容相同std::string to_string( long value ); //与 std::sprintf(buf, "%ld", value)在有足够大的 buf 时产生的内容相同std::string to原创 2021-06-23 21:20:06 · 6909 阅读 · 1 评论 -
c++11总结17——decltype
1. 语法decltype ( expression )decltype(declare type)用于查询表达式的类型,即编译时期进行自动类型推导。如上所示,该语句返回expression表达式的类型。注意:decltype仅仅是查询表达式的类型,并不会对表达式求值。2. 推导规则1)如果 expression是一个不被括号( )包围的表达式,或者是一个类成员访问表达式,或者是一个单独的变量,那么 decltype(exp) 的类型就和 exp 一致,这是最普遍最常见的情况。2)原创 2021-03-14 23:04:58 · 346 阅读 · 0 评论 -
c++11总结16——再谈initialize_list
1. 概念initializer_list是C++11提供的新类型。主要用于列表初始化。待续。。。原创 2021-03-10 19:03:47 · 3079 阅读 · 0 评论 -
c++11总结15——shared_ptr在多线程下的安全性问题
1. 引用boost官方文档中有如下结论:1)同一个shared_ptr被多个线程“读”是安全的;2)同一个shared_ptr被多个线程“写”是不安全的;3)共享引用计数的不同的shared_ptr被多个线程”写“ 是安全的;2. 线程安全shared_ptr指针类有两个成员变量,一个是指向变量的指针;一个是资源被引用的次数,引用次数加减操作内部自动加锁解锁,是线程安全的。2.1 引用计数虽然引用计数存在于每一个shared_ptr对象中,但是实际上它是要跟随对象所管理原创 2021-03-05 23:24:22 · 12273 阅读 · 0 评论 -
c++11总结14——initializer_list
1. 概念initializer_list用于表示某种特定类型的值的数组,是一种模板类型。其原型为:template< class T > //since c++11class initializer_list;2. 使用2.1 初始化std::initializer_list<int> lst{ 1,2,3,4,5 };std::initializer_list<int> lst1(lst);std::initializer原创 2021-02-21 21:40:48 · 501 阅读 · 0 评论 -
c++11总结13——lambda表达式
1. lambda表达式的优点1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象;2)简洁:不需要额外写一个函数或函数对象,避免了代码膨胀和功能分散;3)在需要的时间和地点实现功能闭包,使程序更灵活;2. 概念和基本用法2.1 基本概念lambda表达式定义了一个匿名函数,并且可以捕获一定范围内的变量。基本格式为:[capture] (params) opt->ret { body; };capture:捕获列表para...原创 2021-02-20 20:18:52 · 1212 阅读 · 0 评论 -
c++11总结12——四个智能指针:shared_ptr、uinque_ptr、weak_ptr和auto_ptr
前言智能指针的作用是管理一个指针。申请的空间在函数结束时忘记释放,就会造成内存泄漏。使用智能指针可以很大程度上避免这个问题,因为智能指针是一个类,当超出类的作用域时,类会自动调用析构函数来释放资源。所以智能指针的原理是在函数结束时自动释放内存空间,而不需要手动释放内存空间。1. unique_ptr1.1 独享管理对象所有权unique_ptr独享被管理对象指针的所有权。unique_ptr对象包装一个原始指针,并负责其生命周期。当该对象被销毁时,会在其析构函数中删除关联的原始指针。原创 2021-02-18 21:00:44 · 505 阅读 · 0 评论 -
c++11总结11——半同步半异步线程池
线程池要需要解决的问题传统的方式处理大并发任务时,一个请求对应一个线程来处理,大量的线程创建和销毁会消耗过多的系统资源,还增加了线程上下文切换的开销,线程池技术就是来处理这个问题的。线程池线程池技术通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建好的线程来处理任务,线程在处理完任务后还可以重用,不会被销毁,而是等待下一次任务的到来。线程池的优点1. 对于多核处理器,由于线程会被分配到多个CPU,会提高并行处理的效率;2. 每个线程独立阻塞,可以防止主线程原创 2020-09-20 17:01:42 · 435 阅读 · 0 评论 -
c++11总结10——内存对齐
1. 内存对齐的概念内存对齐是一个数据类型所能存放的内存地址的属性。这个属性是一个无符号整数,并且这个整数必须是2的N次方(1、2、4、8、、、1024、、、)。例如当我们说一个数据类型的内存对齐为8时,是指这个数据类型所定义出来的所有变量的内存地址都是8的倍数。2. 自然对齐的概念当一个基本数据类型的对齐属性和这个数据类型的大小相等时,称为自然对齐。例如一个4字节大小的int型数据,默认情况下字节对齐是4。3. 为什么需要内存对齐?1) 并不是每一个硬件平台都能随便访问任意位置的内原创 2021-01-13 00:08:15 · 990 阅读 · 0 评论 -
c++11总结09——右值引用避免深拷贝
问题代码:class A{public: A() : m_ptr(new int(0)) { cout << "construct" << endl; } A(const A& a) : m_ptr(new int(*a.m_ptr)) { cout << "copy construct" << endl; } ~A() { cout << "destruct" << endl; d原创 2020-10-19 23:53:47 · 1166 阅读 · 0 评论 -
c++11总结05——可变参数模板
1. 概述c++11的新特性中增加了可变参数模板,允许模板定义中包含0到任意个模板参数。声明可变参数模板时需要在typename或class后面带上省略号"...".省略号的作用有两个:1) 声明一个参数包,这个参数包中可以包含0到任意个模板参数。2) 在模板定义的右边,可以将参数包展开成一个个独立的参数。2. 定义可变参数模板的定义如下:template <class... T>void func(T... args){ cout << si原创 2020-10-28 00:31:30 · 380 阅读 · 2 评论 -
c++11总结04——“=default“和“=delete“
c++11之前,如果我们想禁止类的拷贝行为,需要将拷贝构造函数和拷贝赋值函数声明为私有的,只允许友元或者成员可以访问。代码如下:class noncopyable{public: noncopyable() {};private: noncopyable(const noncopyable&); noncopyable& operator=(const noncopyable&);};c++11提供了"=delete"显式禁止类的拷贝,"=default"显原创 2020-11-13 00:21:04 · 288 阅读 · 0 评论 -
c++11总结03——右值引用
左值和右值c++11中所有的值必属于左值、将亡值、纯右值三者之一。将亡值和纯右值都属于右值。区分左右值属性的方法: 若可对表达式用&符取址,则为左值,否则为右值。例如int func() { return 0; } 函数func()的返回值为右值,则不能使用&func()。将亡值将亡值是C++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象,比如返回右值引用T&&的函数返回值、std::move的返回值,或者转换为T&&...原创 2020-12-01 00:01:14 · 1012 阅读 · 0 评论 -
c++11总结08——noexcept关键字
1. 概念noexcept关键字是c++11之后新增的。该关键字会告诉编译器,被修饰的函数不会发生异常,这有利于编译器对程序做更多的优化。2. 两种形式1)noexcept2)noexcept(expression)noexcept(true) 表示被修饰的函数不抛出异常,noexcept(false) 表示被修饰的函数会抛出异常。3. 异常处理//例1bool Compare(int x, int y) throw() //C++11之前{ return x >原创 2021-01-31 22:28:34 · 3319 阅读 · 0 评论 -
c++11总结02——final和override标识符
finalc++11中增加了final标识符,主要有两个作用:1) 限制某一个类不能被继承;2) 限制某一个虚函数不能被重写,且final只能修饰虚函数。例如:class A{public: virtual void foo() final;}class B final : public A{public: void foo(); //error}class C : public B //e...原创 2020-09-15 22:45:49 · 321 阅读 · 0 评论 -
c++11总结06——异步操作类
c++11提供了异步操作类,主要包括std::future、std::promise和std::package_task。另外还有更高层次的异步操作std::async。std::futurethread库提供了std::future用来访问异步操作的结果。future,顾名思义,代表的是未来的一个期待值,future提供了获取异步操作结果的通道。future_status有3种状态,如下所示:1)Deferred:异步操作还未开始;2)Ready:异步操作已经完成;3)Timeou原创 2020-09-16 00:18:47 · 648 阅读 · 0 评论 -
c++11总结07——改进单例模式
泛型单例存在的问题:泛型单例要能够创建所有的类型对象,但是这些类型的构造函数形参不尽相同,参数个数和参数类型可能都不相同,导致我们不容易做一个所有类型都通用的单例。c++11借助可变参数模板实现单例(上代码)#include <iostream>using namespace std;template <typename T>class Singleton{public: template<typename... Args> //可变参数原创 2020-08-25 00:44:39 · 463 阅读 · 0 评论 -
c++11总结01——std::function和std::bind
1. 可调用对象(Callable Objects)的定义1. 是一个函数指针;2. 是一个具有operator()成员函数的类对象(仿函数);3. 是一个可被转换为函数指针的类对象;4. 是一个类成员(函数)指针;2. 可调用对象包装器——std::functionstd::function是可调用对象的包装器,它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存和延迟执行他们。2.原创 2020-08-12 00:26:59 · 329 阅读 · 0 评论