随笔分类 - C++
摘要:上次面试被问到用三个线程循环打印一串字符串,当时没答好,现在一想其实挺简单的,只要用条件变量就好了。使用C++11的标准线程语法,用一个int变量控制条件变量的wait()阻塞等待时机,用notify_all()唤醒条件变量。 具体的代码如下,3个线程分别打印ABC,循环10次: 运行结果如下:
阅读全文
摘要:1. STL中hashtable的实现: 首先,STL中hashtable是实现hash_map和hash_set的底层。它解决冲突的方式是开链法,每个放置索引值的节点称为桶节点(也就是该索引值的头结点),桶节点里放着一个value值,一个指向下一个节点的next指针。 此外,还维护了一个vecto
阅读全文
摘要:1. STL中的内存管理: 首先,先了解一下STL中是如何进行内存的分配和管理的。STL内存管理机制,是将空间配置和构造内容分开,空间分配和释放用alloc::allocate()和alloc::deallocate(),对象构造和析构用alloc::construct()和alloc::destr
阅读全文
摘要:【转载】转自 https://www.cnblogs.com/chogen/p/4574118.html const是一个C++语言的限定符,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序
阅读全文
posted @ 2018-02-12 11:03
IvanB.G.Liu
摘要:使用强制转换 i = (const_cast<Iter>(ci)) 会造成编译错误,不能将const_iterator强制转换成iterator。 在STL中,正确的转换方法是: i = vi.begin(); advance(i, distance<ConstIter>(i,ci) ); 这种方法
阅读全文
posted @ 2018-01-20 13:15
IvanB.G.Liu
摘要:1. 定义: STL中的函数配接器,能够将函数子和另一个函数子、常数、普通函数结合起来。 STL中的函数配接器一共有4个,分别是: bind1nd(op ,value) 相当于构成op(value,param),即把value结合成op的第一个参数; bind2nd(op ,value) 相当于构成
阅读全文
摘要:1. 定义: 函数对象:所有重载了函数调用操作符(operator())的类对象,又称为函数子。在STL中,大多数使用函数子的地方都可以使用函数指针(ps:set和multiset的比较类型必须是函数对象,而不能是函数指针)通过将operator设置为内联函数,可以使程序性能加速。 函数指针:指向某
阅读全文
摘要:1. unary_function: unary_function的定义如下: template<class Arg, class Result> struct unary_function { typedef Arg argument_type; typedef Result result_typ
阅读全文
摘要:1.Member Funcition的各种调用方式 Nonstatic member funcion: Nonstatic member funcion: 编译器将其转为nonmember Function的形式,转化步骤是: (1)添加额外的参数 this指针 (2)对每一个nonstatic d
阅读全文
摘要:1.一个class object的内存空间,除了nonstatic data member外,还有: (1)编译器自动加的额外data member,包括vptr、bptr(指针) (2)alignment(边界校准)的需求而添加的pad空间。 2.对于nonstatic和static成员变量的存取
阅读全文
摘要:1. 使用class封装之后的布局成本: (1)class并没有增加成本,data members直接内含在每一个class object之中,就像C struct一样。而member functions虽然被包含在class的声明之内,但是不出现在Object之中。每一个non-inline fu
阅读全文
posted @ 2018-01-05 15:53
IvanB.G.Liu
摘要:1. 单例模式: 单例模式是最为最常见的设计模式之一。对于任何时刻,如果某个类只存在且最多存在一个具体的实例,那么我们称这种设计模式为单例模式。 2. C++实现方法: 在类内定义一个指向类对象的静态指针pointer并在类外将其指向NULL,然后写一个判断函数getInstance(): (1)当
阅读全文
摘要:1、使用find和count: count(k) 求出键k的出现次数 find(k) 返回第一个拥有键k的实例 multimap<int, int>::size_type cnt = testMap.count(searchItem); multimap<int, int>::iterator it
阅读全文
摘要:1. 容器中对象拷贝高效、防剥离发生的方法: 使容器包含指针而不是对象。(ps:STL容器是在创建拷贝,相比数组,是动态创建,节省时间和空间) 2. 总是调用empty()而不是size==0来判断容器是否为空: empty()对所有STL容器都是常数时间操作,而size()对某些容器(如list)
阅读全文
摘要:(1) 包含在头文件#include <iterator>中 (2) 像使用其他iterator一样使用istream_iterator 和 ostream_iterator: istream_iterator<string> start_cin(cin); //输入迭代器指向标准输入 istrea
阅读全文
摘要:插入方法: 1. vector、list的insert用法: (1)iterator insert( iterator loc, const TYPE &val ) (2)void insert( iterator loc, size_type num, const TYPE &val ) (3)v
阅读全文
摘要:静态多态和动态多态的区别: 静态多态:函数的相互重载,在编译期实现多态,属于早绑定。如:rect.calc(10) 和 rect.calc(10,20),在编译期间已经决定了选择运行哪个函数。编译器多态,一般通过模板的方式实现,即:在编译期间,编译器推断出模板参数,以此来确定模板函数使用哪个类对象的
阅读全文