bind用于绑定可调用(Callable)对象(函数对象、指向函数指针、到函数引用、指向成员函数指针或指向数据成员指针)和其参数。返回值为绑定成功后的函数对象C11中引入的function机制,其中绑定器主要有三种:bind1st、bind2nd、bind(C11) 函数对象尽管函数指针被广泛用于实现函数回调,但C还提供了一个重要的实现回调函数的方法,那就是函数对象。函数对象(也称“函数符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。用函数对象代替函数指针有几个优点: 首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也...

  xs9mrAcZVTZn   2023年11月02日   53   0   0 C++

自己实现绑定器,代码如下 include<iostream> include<vector> include<string> include<algorithm> include<functional> include<ctime> usingnamespacestd; template<typenameContainer> voidprintContainter(Container_container){ typenameContainer::iteratorit_begin=_container.beg...

  xs9mrAcZVTZn   2023年11月02日   80   0   0 C++

模板作为C泛型编程的基础十分重要,其使得一份代码能用于处理多种数据类型。而有些时候,我们会希望对一些特定的数据类型执行不同的代码,这时就需要使用模板特例化(templatespecialization)。 函数模板特例化首先函数模板的特例化并不是函数重载,每一个特例化实际上是提供了另一个模板定义式,因此特例化不影响函数匹配。特例化一个函数模板时,必须为模板中的每个参数都给出实参,关键字template后跟一个<> 1include<iostream> 2include<typeinfo> 3include<string.h> 4usingname...

  xs9mrAcZVTZn   2023年11月02日   68   0   0 C++

std::function是一组函数对象包装类的模板,实现了一个泛型的回调机制。function与函数指针比较相似,优点在于它允许用户在目标的实现上拥有更大的弹性,即目标既可以是普通函数,也可以是函数对象和类的成员函数,而且可以给函数添加状态。声明一个function时,需要给出所包装的函数对象的返回值类型和各个参数的类型。比如,声明一个function,它返回一个bool类型并接受一个int类型和一个float类型的参数,可以像下面这样:function<bool(int,float)>f;下面简要介绍一下function的比较重要的几个接口。 function();缺省构造函数...

  xs9mrAcZVTZn   2023年11月02日   64   0   0 C++

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。 通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1,…,TN的N个参数,并且返回一个可转换到R类型的值。std::function使用模板转换构造函数接收被包装的函数对象;特别是,闭包类型可以...

  xs9mrAcZVTZn   2023年11月02日   84   0   0 C++

bind1st和bind2nd只能用于二元函数对象c11bind绑定器返回的结果还是个函数对象 std::bind函数定义在头文件functional中,是一个函数模板,它就像一个函数适配器,接受一个可调用对象(callableobject),生成一个新的可调用对象来“适应”原对象的参数列表。一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M可以大于N,但这么做没什么意义)参数的新函数。同时,使用std::bind函数还可以实现参数顺序调整等操作 bind简单使用 include<iostream> include<string&g...

  xs9mrAcZVTZn   2023年11月02日   83   0   0 C++

C11函数对象的升级版=>lambda表达式 函数对象的缺点:使用在泛型算法,参数传递,比较性质/自定义操作优先级队列,需要专门定义出一个类 //lambda表达式语法: //[捕获外部变量](形参列表)->返回值{操作代码} autofunc1=[]()->void{cout<<"helloworld"<<endl;} func1(); //编译器根据[]()->void{cout<<"helloworld"<<endl;}产生一个函数对象 上面等价于 template<typenameT=void>...

  xs9mrAcZVTZn   2023年11月02日   65   0   0 C++

既然lambda表达式只能使用在语句中,如果想跨语句使用之前定义好的lambda表达式,怎么办?用什么类型来表示lambda表达式?用function类型来表示函数对象类型 bind1st/bind2ndbind绑定器返回的都是函数对象 lambda表达式=>函数对象 示例1 map<int,function<int(int,int)>>caculateMap; caculateMap[1]=[](inta,intb)->int{returna+b;} caculateMap[2]=[](inta,intb)->int{returna-b;} cacu...

  xs9mrAcZVTZn   2023年11月02日   44   0   0 C++

C语言层面多线程=>好处:跨平台windows/linux thread/mutex/condition_variable lock_gurad/unique_lock atomic/原子类型,基于CAS操作的原子类型线程安全的 睡眠sleep_for Cthread=>windows平台用的createThreadLinux用的pthread_create 简单示例1 include<iostream> include<thread> usingnamespacestd; voidthreadHandler(){ //让子线程睡眠2秒 std::...

  xs9mrAcZVTZn   2023年11月02日   28   0   0 C++

多线程程序竞态条件:多线程程序执行的结果是一致的,不会随着CPU对线程不同的调用顺序而产生不同的运行结果. 解决?:互斥锁mutex 经典的卖票问题,三个线程卖100张票 代码1 include<iostream> include<thread> include<list> include<mutex> intticketCount=100; std::mutexmtx;//互斥锁 voidsellTicket(intwindow){ while(ticketCount>0){ mtx.lock(); std::c...

  xs9mrAcZVTZn   2023年11月02日   18   0   0 C++

C11多线程类库中提供了include 包含了很多原子类型 原子操作若干汇编指令具有读-修改-写类型,也就是说它们访问存储器单元两次,第一次读原值,第二次写新值 假定运行在两个cpu上的两个内核控制路径试图通过执行非原子操作来同时读-修改-写同一个存储器。首先两个cpu都试图读同一单元,然后使用不同的方式修改读取的内容之后将其写入该存储单元。虽然最终两个写操作都会成功,但是全局结果是不对的,因为两个CPU写入同一内存单元,因此两个交错的读-修改-写操作成了一个单独的操作 避免由于"读-修改-写"指令引起的竞争条件的最容易的办法就是确保这样的操作在芯片级是原子的,任何一个这样的操作度必须以单...

  xs9mrAcZVTZn   2023年11月02日   19   0   0 C++

unique_lockcondition_variable1:lock_guard和unique_lock2:condition_variablewait和notify_all 方式1 std::mutexmtx; mtx.lock(); .. ... mtx.unlock();// 容易出现死锁 方式2 lock_gurad<std::mutex>lock(mtx) 出作用域,自动析构(释放锁),缺陷:不能用在函数参数传递或者返回过程中. 只能用在简单的临界区代码段的互斥操作中. 方式3 unique_lock不仅可以使用在简单的临界代码段的互斥操作中,还可以使用在函数...

  xs9mrAcZVTZn   2023年11月02日   19   0   0 C++

底层数据结构:动态开辟的数组,每次以原始空间2倍扩容 vector vec; 增加 vec.push_back(100);容器末尾加元素时间负责度O(1)可能导致容器扩容 容器中的,对象的构造析构,内存的开辟释放,通过什么来实现? 容器的空间配置器allocator allocate deallocate construct destory vec.insert(iterator,20);在迭代器指定位置插入元素,花费的时间和需要移动的元素个数有关O(N),可能导致容器扩容 删除vec.pop_back();末尾删除元素O(1)vec.erase(iterator);删除迭代器指定的位置...

  xs9mrAcZVTZn   2023年11月02日   15   0   0 C++

STL(standardtemplatelibaray标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 通俗来说:STL就是将常见的数据结构(例如顺序表,链表,栈,队列,二叉树,哈希...)以模板的形式进行封装,使用时,不用我们人为再去写,可以直接调用。并且包含常见的通用的泛型算法(一些常规的算法也不用自己实现,可以直接调用) 通用的泛型算法两大特性:通用的:对于任意类型的数据结构都可以处理。(线性表,链表,二叉树....) 模板实现:以模板的方式实现,对于任意数据类型都可以处理。(int/double/short/long.....)...

  xs9mrAcZVTZn   2023年11月02日   16   0   0 C++

deque:双端队列容器(队头队尾都可入,出)底层数据结构情况动态开辟的二维数组,一维数组从2开始,以2倍方式进行扩容,每次扩容后,原来第二维数组从新的第一维数组的下标oldsize/2开始存储如下列图序 满了扩容,扩容第1维,2倍扩 deque deq; 增加:deq.push_back(20);从尾部添加,可能引起扩容O(1)deq.push_font(20);从头部添加,O(1)deq.insert(iterator,20);从迭代器指向的位置加入元素O(N) 删除:deq.pop_back();//从尾部删除元素O(1);deq.pop_front();//从头部删...

  xs9mrAcZVTZn   2023年11月02日   78   0   0 C++

vector和deque之间的区别?vector:底层动态数组,内存连续,二倍方式扩容vector vec;默认是没有开辟空间的,0->1->2->4->8->16可以用reserve(20)只开辟空间,没有放置元素 deque:动态开辟的二维数组空间,第二维是固定长度的空间,扩容的时候,是将第一维数组进行二倍扩容,在把二维的数据空间放到新的第一维的数组空间里 deque:底层存储空间是否连续?不是,但是每一个第二维空间是连续的.所有的二维是分段的. vector和deque1:底层数据结构不一样2:前中后插入删除元素时间复杂度:中间和末尾的插入和删除的时间复...

  xs9mrAcZVTZn   2023年11月02日   74   0   0 C++

标准容器->容器适配器什么叫适配器?1:适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法,全部由底层依赖的容器进行实现的.像标准库中的stack如下图 2:没有实现自己的迭代器 容器适配器stack,queue,priotity_queue没有迭代器 stack s1;栈,队尾后进先出 s1.push();入栈 s1.pop();出栈 s1.empty();判断空 s1.top();栈顶元素 s1.size();个数 queue que;队列先进先出,后进后出,队头出,队尾入 que.pop(); que.font(); que.back();查看队尾元素 que....

  xs9mrAcZVTZn   2023年11月02日   47   0   0 C++

函数对象=》C语言中的函数指针 函数对象尽管函数指针被广泛用于实现函数回调,但C还提供了一个重要的实现回调函数的方法,那就是函数对象。函数对象(也称“函数符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。用函数对象代替函数指针有几个优点: 首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。在使用普通函数时需要将先前调用的结果存储在全程或者本地静态变量中,但是全程或者本地静态变量有某些我们不愿意看到的缺陷。其次,在函数对象中编译器能实现内联调用,从而更进一步增强了性能。这在函数指针中几乎是...

  xs9mrAcZVTZn   2023年11月02日   45   0   0 C++

关联容器 无序关联容器->链式哈希表增删查O(1)set:集合keymap:映射表[key,value] unordered_set单重集合不允许重复unordered_multiset多重集合unordered_map单重映射表unordered_multimap多重映射表 有序关联容器=》红黑树增删查O(log2N)setmultisetmapmultimap unordered_set<int>set1 for(inti=0;i<50;i){ set1.insert(i); } for(intm=0;m<50;m){ set1.insert(m); } c...

  xs9mrAcZVTZn   2023年11月02日   98   0   0 C++

unique_ptr的成员函数在上一篇博客中几乎全部涵盖,其实还有一个很有踢掉,即std::unique_ptr::get_deleter字面已经很明显了,就获得deleter 智能指针采通过引用计数我们能解决多次释放同一块内存空间的问题,并且和之间直接移交管理权的方式比较这种方式更加灵活安全。但是这种方式也只能处理new出来的空间因为new要和析构中的delete匹配,为了使能和new,malloc,fopen的管理空间匹配,我们需要定制删除器 通过自定义删除器,可以实现一些场景下的资源释放和删除. 代码1 include<iostream> include<thread&...

  xs9mrAcZVTZn   2023年11月02日   67   0   0 C++
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~