![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
c++
c++相关
I_ren
这个作者很懒,什么都没留下…
展开
-
C/C++程序员面试秘笈——10.STL
读写文件#include <fstream>istream in("in.txt")//按字节读while (EOF != (ch=f.get()))//按行读char line[128];f.getline(line, 128)string buf;getline(f, buf);fstream out("out.txt")out << line << endl;红黑树的规则1.叶节点和根节点为...原创 2020-08-21 19:56:51 · 161 阅读 · 0 评论 -
C/C++程序员面试秘笈——9. 排序
希尔排序模板的缺点可能导致代码膨胀解决方式:将模板中与参数无关的代码分离模板的特化需要对某些类型进行特殊处理函数模板特化:当IsEqual参数类型为char*时,会调用特化版本类模板特化:部分模板特例化1.对部分模板参数进行特例化2.使用具有某一特征的类型(引用,指针):template <class T>class A<T*>class A <T&&g...原创 2020-08-20 19:02:10 · 188 阅读 · 0 评论 -
C/C++程序员面试秘笈——7.继承和多态
私有继承方式私有继承中,不允许将子类对象转换成父类对象私有继承子类和父类不是is a 的关系,而是is implement in terms of(以...实现)组合与私有继承有一个(has a)关系,单一组合可以与私有继承替换区别:继承可能引入不必要的多重继承继承允许子类指针到父类指针的转换,允许子类重写父类虚函数,允许子类访问父类protected成员选择:尽可能使用组合构造函数...原创 2020-08-18 19:45:50 · 208 阅读 · 0 评论 -
C/C++程序员面试秘笈——8. 数据结构
约瑟夫环将剩下的人重新编号新的编号: 0 1 2 3 4 5 6 7 … n-2对应原来的编号:m m+1, …n-1,0,1…m-2new_idx = (old_idx + m) % nf(1)=0;//递归出口f(n)=[f(n-1)+m]%n;//递归体`原创 2020-08-19 18:26:12 · 160 阅读 · 0 评论 -
STL源码剖析——其他
哈希函数自定义哈希函数:class CustomerHash {public: size_t operator() (const Customer &c) const { return hash_val(c.fname, c.Iname, c.no); }};库提供的hash_val函数:// 第一步调用template <typename... Types>inline size_t hash_val(const Types&原创 2020-08-19 18:01:00 · 131 阅读 · 0 评论 -
STL源码剖析——适配器
设计模式定义将一个class接口转换为另一个class接口种类容器adapter:stack, queue迭代器adapter:reverse iterator, inserter iterator, iostream iterator仿函数adapter函数适配器bindbind1st/bind2nd:绑定第1/2个参数template <class Operation>class binder2nd : public unary_funct..原创 2020-08-19 17:48:17 · 158 阅读 · 0 评论 -
C++ 判断是否有某个成员变量并赋值
参考https://stackoverflow.com/questions/1005476/how-to-detect-whether-there-is-a-specific-member-variable-in-class中的解决方案,利用decltype, 模板多态,std::false_type, std::true_type快速判断是否有某个名称的成员变量template <typename T, typename = int>struct HasX : std::false_t原创 2020-08-19 14:20:06 · 1819 阅读 · 0 评论 -
C/C++程序员面试秘笈——6.面向对象
静态数据成员相比全局对象的优势静态数据成员不会与程序中其他全局名字冲突静态数据成员可以是private成员,隐藏信息拷贝构造函数与赋值构造函数的区别拷贝构造函数是一个构造函数;用一个对象来初始化新对象的内存区域赋值构造函数是operator=操作;对一个已经被初始化的对象进行赋值;如果原来对象中有内存分配,先要把内存释放掉;如果两个对象是同一个对象,则不做任何操作。...原创 2020-08-17 20:10:10 · 143 阅读 · 0 评论 -
STL源码剖析——仿函数
仿函数定义与用法用法:#include <functional>greater<int> ig;cout << ig(4,6) << endl;cout << greater<int>()(4,6) << endl;accumulate(iv.begin(), iv.end(), 1, multiplies<int>());可配接性继承unary_function/binary_原创 2020-08-16 20:19:07 · 171 阅读 · 0 评论 -
C/C++程序员面试秘笈——5.位运算与嵌入式编程
printf中%d,%f区别%d表示参数为int类型,会从栈中读取4个字节%f表示参数为double类型,会从栈中读取8个字节中断服务程序ISR1.不能返回值2.不能传递参数3.不应当作浮点运算(不可重入)4.不应当调用printf(不可重入)裸奔系统中,中断程序由硬件触发执行。这意味着中断函数没有具体的调用者,所以,中断函数无法将值返回给任何对象。...原创 2020-08-16 20:10:50 · 245 阅读 · 0 评论 -
C/C++程序员面试秘笈——4. 字符串
C库函数中数字与字符串的转换数字 -> 字符串字符串 -> 数字原创 2020-08-14 16:07:51 · 147 阅读 · 0 评论 -
C/C++程序员面试秘笈——3. 引用和指针
字、字节、bit一个字节(byte) = 8 bit一个字 = 4 type (32位系统)一个字 = 8 byte (64位系统)句柄windows环境中用来标识项目(模块、任务、文件等)指针和句柄区别:1.句柄指向与系统相关的结构,如线程的句柄2.指针指向的结构通常用用户定义...原创 2020-08-12 19:26:36 · 136 阅读 · 0 评论 -
C/C++程序员面试秘笈——2.预处理,const, static, sizeof
define中的#和###s:将宏参数s变为字符串a##b:将参数a和b连接起来内联函数与宏宏缺点:1.不能进行参数有效性检查2.参数类型不能作自动类型转换3.不能访问类成员变量4.容易产生二义性内联函数:要求不允许有循环或递归,如果不符合要求,会被当做普通函数有参数类型检查会使代码变长,占用内存...原创 2020-08-11 20:55:55 · 201 阅读 · 0 评论 -
STL源码剖析——算法
1#include <numeric>//计算累积总和template <class InputIterator, class T>T accumulate<InputIterator first, InputIterator last, T init) { for (; first != last; ++first) init = init + *first; return init;}//将相邻两元素的差(后-前)赋值给目原创 2020-08-14 15:01:28 · 295 阅读 · 0 评论 -
C/C++程序员面试秘笈——1.基础
交换2个数不使用临时变量,且不会出现溢出的方法预处理命令——编译器当前使用c++编译器:#ifdef __cplusplus当前使用c编译器:#ifdef __STDC__重载的底层实现C++支持重载,C不支持重载1.编译生成的符号可能为_foo_int_int2.编译生成的符号可能为_foo_int_float增加extern "C"声明后,编译生成目标代码时,采取C语言的方式,可能为_foo。at...原创 2020-08-06 19:36:49 · 445 阅读 · 0 评论 -
STL源码剖析——hashtable, unordered_set, unordered_map
1template <class Value>struct __hashtable_node{ __hashtable_node *next; Value val;};1template <class Value, class Key, class HashFcn, class ExtractKey, class EqualKey, class Alloc>struct __hashtable_iterator { node *cur;原创 2020-07-30 20:25:22 · 222 阅读 · 0 评论 -
STL源码剖析——rb_tree, map, set
1template <class Key, class Value, class KeyOfValue, class Compare, class Alloc = alloc>class rb_tree {protected: size_type node_count; link_type header; Compare key_compare;public: typedef __rb_tree_iterator<value_type, refe原创 2020-07-28 16:51:11 · 203 阅读 · 0 评论 -
STL源码剖析——heap
binary_heap一种完全二叉树假设array[0]号元素设为无限大或无限小,则某个节点位于array[i]时,它的左孩子节点位于array[2i]处,右孩子节点位于array[2i+1]处,父节点位于array[i/2]处插入元素:push_heap首先需要将插入的元素放在vector尾部进行上溯:与父节点比较,如果父节点小则交换位置,直到不需要对换或到达根节点为止template <class RandomAccessIterator>in..原创 2020-07-22 18:24:48 · 191 阅读 · 0 评论 -
STL源码剖析——容器适配器stack, queue
stack不提供迭代器和遍历//默认用deque进行适配template<class T, class Sequence = deque<T>>class stack { friend bool operator==__STL_NULL_TMPL_ARGS(const stack&, const stack&); friend bool operator<__STL_NULL_TMPL_ARGS(const stack&a.原创 2020-07-21 18:31:33 · 155 阅读 · 0 评论 -
STL源码剖析——deque
1template <class T, class Alloc = alloc>class vector {public: typedef T value_type; typedef value_type* pointer; typedef value_type* iterator; typedef value_type& reference; typedef size_t size_type; ty原创 2020-07-21 18:02:56 · 191 阅读 · 0 评论 -
STL源码剖析——链表
list环状双向列表template <class T>struct __list_node { typedef void* void_pointer; void_pointer prev; void_pointer next; T data;}迭代器bidirectional iterators插入删除过程中其他迭代器不受影响template<class T, class Ref, class Ptr>st.原创 2020-07-21 17:34:57 · 311 阅读 · 0 评论 -
STL源码剖析——vector
vector结构体:template <class T, class Alloc = alloc>class vector {public: typedef T value_type; typedef value_type* pointer; typedef value_type* iterator; typedef value_type& reference; typedef size_t size_typ原创 2020-07-21 17:34:01 · 185 阅读 · 0 评论 -
STL源码剖析——Allocator
1//构造auto_ptr<string> ps(new string("jjhou");//获取指针ps.get();//重载*, ->cout << *ps << endl;cout << ps->size() << endl;2//获取class类型的迭代器value_typetemplate<class I>struct iterator_traits{ typedef ty原创 2020-07-13 19:34:17 · 164 阅读 · 0 评论 -
STL源码剖析——allocator
1// in oom_mallocfor(;;){ //如果没有设定内存不足处理例程,则直接抛出异常 if (0 == __malloc_alloc_oom_handler) {__THROW_BAD_ALLOC;} (*__malloc_alloc_oom_handler)(); result = malloc(n); if (result) return result;}2// free-list节点结构union obj{ un原创 2020-07-09 22:31:10 · 251 阅读 · 0 评论 -
STL源码剖析——基础
六大部件模板类模板 函数模板 成员模板(类拥有本身为类模板或函数模板的成员)特化:优先选择特化版本template<class T> struct __type_traits{ ...};template<> struct __type_traits<int>{ ...};template<> struct __type_traits<char>{ ...};....偏.原创 2020-07-07 19:08:15 · 601 阅读 · 0 评论 -
Leetcode 407. Trapping Rain Water Ⅱ
首先,将四条边上的点加入PQ中,且标记为visitedRepeat until PQ is empty: pop PQ中的最小值min,遍历它的四个邻居neighbor: 如果neighbor没有被visited: result += max(0, min - neighbor) 设置neighbor = max(neighbor, min),并加入PQ中,且标记为visitedclass ...原创 2020-05-27 12:09:43 · 143 阅读 · 0 评论 -
Leetcode 406. Queue Reconstruction by Height
将输入按照h降序,k升序进行排序。定义新的队列为空。然后按序遍历输入,将每个人按照idx = k插入到新的队列中,能够保证后插入的人一定不会影响到之前插入的人。class Solution {public: vector<vector<int>> reconstructQueue(vector<vector<int>>& people) { vector<vector<int>> re..原创 2020-05-26 09:56:25 · 109 阅读 · 0 评论 -
C++ Primer 笔记19. 特殊工具与技术
控制内存分配new步骤:1.调用operator new分配内存2.调用构造函数,并传入初始值3.返回指向对象的指针delete步骤:1.对指向的对象执行对应的析构函数2.调用operator delete释放内存空间使用全局作用域的new和delete:标准库版本:继承C语言中的malloc与free:内存分配与初始化分离1.使用allocator类2.使用operator new和operator delete分配和释放空间;定位new构造对...原创 2020-05-20 12:45:11 · 196 阅读 · 0 评论 -
C++ Primer 笔记18. 用于大型程序的工具
异常处理栈展开:当抛出异常,程序寻找对应catch子句如果没有找到,且该try嵌套在其他try中,则检查外层try匹配的catch子句如果找不到,则退出当前函数,在调用当前函数的外层函数中继续寻找否则程序将退出捕获异常:noexcept:当noexcept函数抛出异常,程序会调用terminate如果基类虚函数承诺不会抛出异常,派生虚函数必须作出同样的承诺;反之不是异常类层次:使用自己定义的异常类命名空间全局命名空间:...原创 2020-05-19 19:00:22 · 162 阅读 · 0 评论 -
C++ Primer 笔记17. 标准库特殊设施
tuple类型bitset类型正则表达式随机数随机数引擎:引擎种类I/O库bool:默认打印0/1打印值为true或者false:整型:控制精度:指定浮点数计数法:打印小数点:输出补白:控制输入格式:未格式化的输入输出:流随机访问:...原创 2020-05-18 14:43:51 · 135 阅读 · 0 评论 -
C++ Primer 笔记16. 模板与泛型编程
定义模板函数模板:编译器根据实参类型实例化特定版本的函数模板参数列表:非类型模板参数:表示一个值类模板:代替用户需要提供的类型或值友元与类模板:别名:static函数:每个实例都有自己的static成员实例必须通过引用特定的实例来访问static成员当名字表示类型时,必须用关键字typename显示标注本身是模板的成员函数不能是虚函数默认模板实参:控制实例化:避免多个文件中实例化相同...原创 2020-05-15 16:59:06 · 147 阅读 · 0 评论 -
C++ Primer 笔记15.面向对象程序设计
概述动态绑定:定义基类和派生类派生类对象概念模型:允许将基类指针或引用绑定到派生类对象的基类部分上派生类的构造函数:将某个类用作基类,则该类必须已经定义final关键字阻止继承:静态类型:编译时已知的类型动态类型:表示内存中的对象类型,运行时才知道类型不存在类型转换:当基类的构造函数传递一个派生类对象时,构造函数只处理基类自己的成员虚函数当使用指针或引用调用虚函数时执行动态绑定(运行时解析),否则都在编译时进行解...原创 2020-05-11 16:46:24 · 139 阅读 · 0 评论 -
C++ Primer 笔记14. 重载运算与类型转换
输入输出重载必须是非成员函数算术和关系运算符+,-,*,/=,!=,>,>=,<,<=赋值运算符赋值:复合赋值:下标运算符必须是成员函数两个版本:1.作用于常量对象,返回常量2.作用域非常量对象递增递减运算符前置递增、递减:...原创 2020-05-08 15:51:01 · 137 阅读 · 0 评论 -
C++ primer 笔记13. 拷贝控制
拷贝、赋值与销毁拷贝构造函数:第一个参数是自身类类型引用,且任何额外参数都有默认值等价的合成拷贝赋值运算符:拷贝初始化:其他情况:非引用的函数对象参数传递非引用的函数返回对象使用容器调用insert或push操作要求编译器生成合成版本:阻止拷贝和赋值1.定义删除的函数2.声明为private,且不定义交换操作swa...原创 2020-05-06 13:41:28 · 158 阅读 · 0 评论 -
C++ primer 笔记12. 动态内存
动态内存与智能指针头文件 <memory>直接管理内存new, delete如果内存耗尽,new会抛出bad_alloc异常阻止new抛出异常:delete之后,指针变成空悬指针,指向现在已经无效的内存,将nullptr赋予指针,指明其不指向任何对象shared_ptr和unique_ptr都支持的操作:shared_...原创 2020-05-02 15:32:25 · 124 阅读 · 0 评论 -
C++ primer 笔记11. 关联容器
关联容器类型map和set简单操作:关联容器概述定义及初始化:关键字类型要求必须定义元素比较的方法pair类型:关联容器操作对于map迭代器解引用(*map_it),会得到pair类型set迭代器是const添加元素:insert:insert返回值:返回pair,pair.first表示插入元素...原创 2020-04-30 16:35:21 · 155 阅读 · 0 评论 -
C++ primer 笔记10. 泛型
概述算法对迭代器指定的元素范围进行操作,算法不依赖于容器类型泛型算法只读算法:写算法:排序:其他:定制操作自定义sortlambda表达式find_if,查找第一个符合条件的元素:for_each,对每个元素调用:隐式捕获: 让编译器根据lambda体中的代码推断要使用哪些变量 [=]...原创 2020-04-29 12:04:14 · 132 阅读 · 0 评论 -
C++ primer 笔记9. 顺序容器
概述顺序容器类型:容器库迭代器类型:容器初始化:array:具有固定大小,定义时,需要指定容器大小assign(顺序容器):array不支持assign以及花括号包围的值列表进行赋值swap:交换两个容器的内部数据结构,元素本身并未交换,操作很快除string外,迭代器、引用和指针都不会失效swap array会交换它们的元素,...原创 2020-04-27 12:42:23 · 145 阅读 · 0 评论 -
C++ primer 笔记8. I/O库
IO类头文件:<iostream> <fstream> <sstream>支持宽字符wchar_t的类型:wistream, wostream, wiostreamwifstream, wofstream, wfstreamwistringstream, wostringstream, wstringstreamwcin, wco...原创 2020-04-25 12:50:18 · 126 阅读 · 0 评论 -
C++ primer 笔记7. 类
定义抽象数据类型const常量成员函数:不能改变调用它的对象内容利用引用传递定义IO类函数:默认构造函数: 如果没有定义构造函数,则编译器会隐式定义一个默认构造函数 如果定义了别的构造函数,仍然需要使用默认构造函数,则利用default显示定义:定义在函数内部的成员函数自动是inline,在类外部可以用inline关键词修饰函数定义构造函...原创 2020-04-24 13:28:08 · 152 阅读 · 0 评论