随笔分类 - C/CPP学习
摘要:约定: A -> B : T = type 含义是把参数 A 传入以 B 为模板类型参数, typename 为 T 的模板中时, T 的类型会被推断为 type. 其中, any 指任何类型, |T| 为实参类型, T = error 意味着错误.|T| -> T&& : T = T&T&& ->...
阅读全文
摘要:之前的一篇博客中已经提到过了, 使用模板的目的是提高效率, 可是会因为用户输入的不可预知性导致计划中的函数没有匹配到, 而是被模板函数接收, 所以我们的策略就是, 使用 SFINAE 这个 trick:templatevoid LogAndAdd(T &&name){ LogAndAddImp...
阅读全文
摘要:考察以下代码:std::multiset names; //global data structurevoid LogAndAdd(const std::string &name){ auto now = //got...
阅读全文
摘要:还是在 C++ 吧里的问题, 有人问怎样终止形如 while(std::cin >>word){/* do something */} 的情况, 除了用 Ctrl +C.我原以为下面定是一群人回答 Ctrl + Z, 结果还是我一厢情愿, 不少人还说那是个死循环, 非要加个条件 break 出去才能...
阅读全文
摘要:在贴吧里看到一个求助的, 他是这么做的:char month[] = {"一月", "二月", ......}; //我就不写全了然后表示为何出错. 我觉得这算是宽字符, 所以改成了:wchar_t month[] = {L"一月", .....}; //没错我连第二个都懒得打感觉就万事大...
阅读全文
摘要:1. 容器(constainers) 现成的模版形式的数据结构, 如 vector, deque, set, map... 主要用来存放数据;2. 算法(algorithms) 我倾向于叫做泛型算法, 常见的有 sort, search, copy, erase... 主要用函数模板实现;3. 迭代...
阅读全文
摘要:当我们设计一个 class, 并以一个 class object 指定给另一个 class object 时, 我们有三种选择:1. 什么也不做, 实施默认行为2. 提供一个 explicit copy assignment operator3. 明确拒绝把一个 class object 指定给另一...
阅读全文
摘要:我一向赞同一个理念: 用代码实现简单逻辑是不需要注释的, 因此我也就不写注释了, 直接上代码:#include #include #include inline int Parent (const int i){ return std::move( i % 2 ? (i - 1)...
阅读全文
摘要:有时代码看起来是正确的, 可实际上就会有一些没想到的疏忽, 考察以下代码:std::deque ideq{ 5, 13, 2, 25, 7, 17, 20, 8, 4};std::priority_queue priorityQueue (ideq.begin(), ideq.end());for ...
阅读全文
摘要:前几天处理工作方面的事情, 确实耽误了几天, 导致博客停更了, 今天上午看到算法导论的堆排序, 想用 C++ 实现下, 就当练练手了.算法导论里使用的是起始编号为 1 的容器, 那么实现的方法要不就是把 STL 容器打包, 自己建一个起始编号为 1 的容器, 要不就按照起始编号为 0 的来. 想了一...
阅读全文
摘要:考虑下面这个虚拟继承:class Point3d: public virtual Point{ Point3d(float x = 0.0, float y = 0.0, flloat z = 0.0) :Point(x, y). _z(z){} Pooint(const ...
阅读全文
摘要:继承前的准备前一篇博客的三个 Point 声明, 将为继承性质以及某些操作的动态决议做准备, 现在咱们限制对_z 的存取操作:class Point{public: Point(float x = 0.0, float y = 0.0, float z = 0.0) :_x(x), _y...
阅读全文
摘要:考虑以下代码:Point global; //1)Point Foobar(){ Point local; //2) Point *heap = new Point; //3) *heap = local; ...
阅读全文
摘要:考察以下代码:class AbstractBase{public: virtual IBase() = 0; virtual Interface() const = 0; virtual const char* Member() const {return _memb...
阅读全文
摘要:下面是 Point class 的一个加法运算符的可能实现内容:class Point{ friend Point opsrator+(const Point&, const Point&);};Pointopsrator+(const Point &lhs, const Poi...
阅读全文
摘要:nonmember friend 或 nonstatic member 或 static member 函数都会被转化为相同的形式, 因此三者的效率完全相同.另外, inline member function 的效率一直是最高的(前提是简单操作), 优化后的效率更是高, 这是因为编译器会将被视为不...
阅读全文
摘要:考虑下面的 virtual base class 派生体系:class Point2d{public: Point2d(float = 0.0, float = 0.0); virtual ~Point2d(); virtual void Mumble(); virtual ...
阅读全文
摘要:在多重继承中支持 virtual function, 其复杂度围绕在第二个及后继的 base classes 上, 以及必须在执行期调整 this 指针这一点, 以以下的 class 体系为例:class Base1{public: Base1(); virtual ~Base1(); ...
阅读全文
摘要:看过之前的 virtual function可以知道其实现模型: 每一个 class 有一个 virtual table. 内含该 class 之中 有作用的 virtual function 地址, 然后每个 object 有一个 vptr, 指向 virtual table 的所在. 在这一节中...
阅读全文
摘要:如果一个 normalize() 是一个 virtual member function, 那么以下的调用:ptr->normalize();将会被内部转化为:(*ptr->vptr[1])(ptr);其中:vptr 表示由编译器生成的指针, 指向 virtual table, 它被安插在每一个声明...
阅读全文
浙公网安备 33010602011771号