![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STL源码
文章平均质量分 82
ShenHang_
一个编程小菜鸡
展开
-
非常量引用的初始值必须为左值
先看一段报错的代码:#include<iostream>using namespace std;int main(){ int i = 2; double &r = i; system("pause"); return 0;}原创 2021-05-08 18:50:01 · 5414 阅读 · 0 评论 -
一元函数对象、二元函数对象、一元谓词函数对象、二元谓词函数对象、lambda表达式、函数适配器binder2nd及其辅助函数bind2nd
一元函数对象:函数参数1个二元函数对象:函数参数2个;一元谓词对象:函数参数1个,函数返回值是bool类型,可以作为一个判断式,谓词可以是一个仿函数,也可以是一个回调函数;二元谓词对象:函数参数2个,函数返回值是bool类型;之所以给返回布尔类型的函数对象专门命名,是因为谓词是用来为算法判断服务的。一元谓词...原创 2021-05-07 16:49:06 · 291 阅读 · 0 评论 -
C++11 final关键字
1.禁用继承C++11中允许将类标记为final,方法时直接在类名称后面使用关键字final,如此,意味着继承该类会导致编译错误。实例如下:class A final {};class B :public A{};//error2.禁用重写C++中还允许将方法标记为final,这意味着无法再子类中重写该方法。这时final关键字至于方法参数列表后面,如下:class A{public: virtual void fun() final {};};class A{pu原创 2020-09-09 21:21:20 · 371 阅读 · 0 评论 -
std::move分析
move函数的作用就是把传入的参数t的类型转换为右值引用,至于后续的所有权转交问题,是由移动构造函数或移动赋值函数完成的,不要搞混了!/*源代码*/template <typename T>typename remove_reference<T>::type&& move(T&& t){ return static_cast<typename remove_reference<T>::type&&>(t原创 2020-07-28 15:33:25 · 300 阅读 · 0 评论 -
C++11——移动构造函数及std::move() 的使用
td::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的 char 数组被析构函数释放,如果a是一个临时变量,则上面的拷贝,析构就是多余的,完全可以把临时变量a中的数据直接 “转移” 到新的变量下面即可。#include <iostream>...原创 2020-04-23 17:55:41 · 15119 阅读 · 2 评论 -
C++11——variadic template
例1://例1:void print()//递归出口{ cout << "递归出口" << endl;}template<typename T, typename... Types>//版本1void print(const T&firstArg, const Types&...args){ cout << firstArg << endl; print(args...);}template<ty原创 2020-07-22 11:17:51 · 214 阅读 · 0 评论 -
C++11——lambda表达式
将vector中的某些元素删除使用functor#include<iostream>#include<vector>#include<bitset>#include<algorithm>using namespace std;class my_functor{public: my_functor(int aa, int bb) :a(aa), b(bb) {} bool operator()(int n)const { retu原创 2020-07-21 21:51:32 · 517 阅读 · 0 评论 -
C++11——多个参数的显式构造函数
直接上两段小代码,对比着看就明白了。class P{public: P(int a, int b) { cout << "P(int a, int b)" << endl; } explicit P(int a, int b, int c) { cout << "explicit P(int a, int b,int c)" << endl; }};void fp(const P&) {}int main(){ P p4原创 2020-07-21 09:47:13 · 1348 阅读 · 0 评论 -
STL源码分析——iterator_traits(模板的泛化、特化、偏特化)
iterator_traits可以理解为一问一答的一个萃取机。template <class _Iterator>struct iterator_traits{ typedef typename _Iterator::iterator_category iterator_category; typedef typename _Iterator::val...原创 2020-05-05 10:57:38 · 399 阅读 · 0 评论 -
简单实现一下string类
自己简单实现一下String类,代码如下://自己简单实现一下String类#pragma warning( disable : 4996)class MyString{private: char*_data; size_t _len; void _init_data(const char*s) { _data = new char[_len + 1]; memcpy(_...原创 2020-05-04 21:15:23 · 454 阅读 · 0 评论 -
STL源码分析——type_traits
type_traitstype_traits是C++11提供的模板元基础库。type_traits可实现在编译期计算、判断、转换、查询等等功能。type_traits提供了编译期的true和false。// type_traits中源码//is_const的实现//以下为了和实际源代码区分,全部加了mytemplate<typename _Tp>struct my_is...原创 2020-05-03 22:59:01 · 266 阅读 · 0 评论 -
C++中重载operator()构成仿函数
/** 仿函数(functor)就是使用起来像函数一样的东西。* 如果针对某个类进行operator()重载,它就成为一个仿函数。*/#include <iostream>using namespace std;template < typename T >class plus{ T operator( )( const T& x, co...原创 2020-04-21 21:13:01 · 531 阅读 · 0 评论 -
STL源码分析——字符特性类模板char_traits
字符特性模板,目的是提供最基本的字符特性的统一的方法函数。char_traits继承了__char_traits_base// Class __char_traits_base.// 字符特性基类模板template <class _CharT, class _IntT> class __char_traits_base {public: typedef _Char...原创 2020-05-03 16:05:14 · 596 阅读 · 0 评论 -
STL源码分析——一个万用的Hash Function
class Customer{public: string fname; string lname; long no; Customer(const string _fname, const string _lname, long _no) :fname(_fname), lname(_lname), no(_no) {}//constructor};template<...原创 2020-05-02 22:01:27 · 291 阅读 · 1 评论 -
STL源码分析——istream_iterator(本质上是一个iterator adapter)
template<class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>class my_istream_iterator :public iterator<input_iterator_tag, T, Distance, const T...原创 2020-05-02 10:28:43 · 368 阅读 · 1 评论 -
STL源码分析——ostream_iterator(本质上是一个iterator adapter)
由于ostream_iterator的类模板比较简单,就不需要适配器辅助函数创建其对象,可以直接指定模板参数创建对象。template<class InputIterator, class OutputIterator>//函数模板OutputIteratormy_copy(InputIterator first, InputIterator last, OutputItera...原创 2020-05-01 22:29:02 · 307 阅读 · 0 评论 -
STL源码分析——insert_iterator(本质是一个iterator adapter)及其辅助函数inserter
我们可以看出,copy就是将result的内容逐一拷贝到目标地址(从first开始)而已,这是覆盖,根本就不是插入嘛。那么insert功能是怎么实现的呢?关键在insert_iterator重载了operator=, 在=运算符重载函数中又调用了container->insert,使得insert iterator永远随着其target贴身移动。template<class In...原创 2020-05-01 19:58:14 · 409 阅读 · 2 评论 -
前置后置单目运算符重载函数返回值用法
转载自:https://www.cnblogs.com/zhanjxcom/p/4418201.htmlClock& Clock::operator ++() //前置单目运算符重载函数{Second++;if(Second>=60){Second=Second-60;Minute++;if(Minute>=60){Minute=Minute-60;Hou...转载 2020-05-01 19:49:11 · 866 阅读 · 0 评论 -
STL源码分析——reverse_iterator(本质就是iterator adapter)
不用解释,直接上代码:template<class Iterator>class my_reverse_iterator{protected: Iterator current;//正向迭代器public: typedef typename iterator_traits<Iterator>::iterator_category iterator_catego...原创 2020-05-01 15:53:36 · 232 阅读 · 0 评论 -
STL源码分析——函数适配器unary_negate以及函数适配器辅助函数not1
template<class Predicate>class my_unary_negate :public unary_function<typename Predicate::argument_type, bool>{protected: Predicate pred;//一元谓词对象public: //constructor explicit my_...原创 2020-04-30 17:38:36 · 249 阅读 · 0 评论 -
STL源码分析——函数适配器binder2nd以及函数适配器辅助函数bind2nd
template<class Operation>class my_binder2nd//仿函数适配器functor adapter :public unary_function<typename Operation::first_argument_type, typename Operation::second_argument_type>{protected:...原创 2020-04-30 16:36:20 · 238 阅读 · 0 评论 -
STL源码分析——常用算法
通过以下几个常见算法的源码分析,以后用STL的算法时,即使不知道其内部实现,但也可以理解其调用的原理了。1.accumulate//STL的accumulate源码template<class InputIterator, class T>T my_accumulate(InputIterator first, InputIterator last, T val){ fo...原创 2020-04-29 17:30:28 · 265 阅读 · 0 评论 -
C++ typedef typename的作用
在看了几篇blog后自己琢磨了一下,明白typedef typename的作用了,先上一段自己编的代码:template<class T>class Test_1 {public: //... typedef int size_type; //...private: T data;};template<class T>class Test_2 {p...原创 2020-04-28 17:23:13 · 698 阅读 · 1 评论