12 2021 档案

摘要:第43条:算法调用优先于手写的循环 对于许多C++程序员来说,编写一个循环比调用一个算法更自然,而且读懂循环代码比读懂mem_fun_ref或mem_fun更容易。为什么要优先调用算法,而不是手写循环呢? 因为三个理由: 效率:算法通常比程序员自己写的循环效率更高。 正确性:自己写循环比使用算法更容 阅读全文
posted @ 2021-12-29 11:33 明明1109 阅读(119) 评论(0) 推荐(0) 编辑
摘要:std::bind 之前这篇文章已经讲过C++ 参数绑定bind(适用于C++11以后),参见 C++ Primer学习笔记 - 参数绑定bind。 using namespace placeholders; // or using std::placeholders::_1; auto f = b 阅读全文
posted @ 2021-12-28 16:15 明明1109 阅读(862) 评论(0) 推荐(0) 编辑
摘要:函数子、函数子类的基本概念 所有重载了函数调用操作符(operator())的类都是一个函数子类(又称函数类型)。 从这些类创建的对象被称为函数对象,或函数子(functor)。 也就是说,函数子类是一种class,而函数子是这个class的一个object。函数子类可用作模板的参数类型,而函数子则 阅读全文
posted @ 2021-12-25 00:23 明明1109 阅读(149) 评论(0) 推荐(1) 编辑
摘要:插入迭代器 当通过insert、push_front、push_back等方式加入新对象到STL容器时,容器会自动扩充存储空间以存储这些对象。但STL容器并不总是能正确管理其存储空间。 例如, int transmogrify(int x); // 根据x生成一个新值 vector<int> val 阅读全文
posted @ 2021-12-23 23:09 明明1109 阅读(67) 评论(0) 推荐(0) 编辑
摘要:第26条:iterator优先于const_iterator、reverse_iterator以及const_revserse_iterator STL标准容器提供4种不同的迭代器类型:iterator、const_iterator、reverse_iterator、const_reverse_it 阅读全文
posted @ 2021-12-21 23:26 明明1109 阅读(110) 评论(0) 推荐(0) 编辑
摘要:第19条:理解相等(equality)和等价(equivalence)的区别 相等关系 相等基于operator==。如果表达式“xy”返回true,则x和y值相等;否则,不相等。 相等不一定意味着等价。比如,Widget类内部有一个记录最近一次被访问的时间,而operator可能忽略该域 clas 阅读全文
posted @ 2021-12-21 14:42 明明1109 阅读(98) 评论(0) 推荐(0) 编辑
摘要:第13条:vector和string优先于动态分配的数组 使用new来动态分配内存,意味着使用者将承担责任: 必须确保有人会用delete删除所分配内存。如果没有,new将导致内存泄漏; 必须确保使用正确delete形式。单个对象删除用delete,数组删除用delete[]; 必须确保只delet 阅读全文
posted @ 2021-12-19 13:52 明明1109 阅读(102) 评论(0) 推荐(0) 编辑
摘要:第1条:慎重选择容器类型 C++提供容器 标准STL顺序容器:vector、string、deque、list; 标准STL关联容器:set、multiset、map和multimap; 非标准顺序容器slist和rope。 slist(单向链表), rope(可持久化平衡树)是SGI STL(ST 阅读全文
posted @ 2021-12-19 09:26 明明1109 阅读(87) 评论(0) 推荐(0) 编辑
摘要:remove 用来移除容器对应迭代器区间[first, last)中,所有值与value相等的元素。相等通过operator== 来比较。 remove_if 用来移除容器对应迭代器区间[first, last)中,满足判别式p返回true的元素。 函数模板原型 #include <algorith 阅读全文
posted @ 2021-12-16 01:09 明明1109 阅读(2512) 评论(0) 推荐(1) 编辑
摘要:目录 在学习C++ Primer时,我们知道STL有3种插入迭代器,分别是:back_inserter,front_inserter,inserter 。 back_inserter:利用push_back在尾部插入元素; front_inserter:利用push_front在头部插入元素; in 阅读全文
posted @ 2021-12-14 22:38 明明1109 阅读(62) 评论(0) 推荐(0) 编辑
摘要:条款49:了解new-handle的行为 Understand the behavior of the new-handler. operator new:分配例程; operator delete:归还例程。 new-handler:operator new无法满足客户的内存需求时所调用的函数。 阅读全文
posted @ 2021-12-13 10:43 明明1109 阅读(200) 评论(0) 推荐(0) 编辑
摘要:条款53:不要轻忽编译器警告 Pay attention to compiler warnings. 在C++,编译器作者通常对于将会发生的事情比程序员有更好的领悟。例如,下面的例子很常见: 程序员希望以Df重新定义virtual Bf,但其中有个错误:B::f是const成员函数,而在D中没声明。 阅读全文
posted @ 2021-12-09 10:51 明明1109 阅读(124) 评论(0) 推荐(0) 编辑
摘要:using 声明 using声明(using declaration),一次引入命名空间的一个成员。通过using声明,我们可以清楚知道程序中使用的到底是哪个名字。using声明不允许同名成员,如果有,就不能使用using声明,可以用全名替代。 有效范围从using声明处开始,一直到using声明所 阅读全文
posted @ 2021-12-07 20:55 明明1109 阅读(1373) 评论(0) 推荐(0) 编辑
摘要:C/C++中,计算算法时间方法各异,不同系统平台提供系统调用接口可能不一样。 使用clock() clock()获取从程序启动到调用时,CPU计时时间,精度CLOCKS_PER_SEC。 CLOCKS_PER_SEC也是每个CPU计数所代表的时间含义,比如CLOCKS_PER_SEC为1000,代表 阅读全文
posted @ 2021-12-06 09:34 明明1109 阅读(1074) 评论(0) 推荐(0) 编辑
摘要:条款41:了解隐式接口和编译期多态 Understand implicit interfaces and compile-time polymorphism. 显式接口和运行期多态 面向对象编程中,以显式接口(explicit interface)和运行期多态(runtime polymorphis 阅读全文
posted @ 2021-12-06 08:55 明明1109 阅读(281) 评论(0) 推荐(0) 编辑
摘要:背景 C++ 11 新特性对象移动,可以移动对象而非拷贝。在某些情况下,对象拷贝后就立刻被销毁了,比如值传递参数,对象以值传递方式返回,临时对象构造另一个对象。在这些情况下,如果使用移动对象而非拷贝对象能大幅提升性能。 string s1(string("hello")); // 无名对象strin 阅读全文
posted @ 2021-12-05 22:48 明明1109 阅读(1374) 评论(0) 推荐(0) 编辑
摘要:为什么会有allocator类 new将内存分配和对象构造组合到了一起,delete将对象析构和内存释放页组合到了一起。 当申请分配一大块内存时,我们通常希望将内存分配和对象构建分离开。比如,下面将内存和对象构造组合到一起可能导致不必要的浪费: string *const p = new strin 阅读全文
posted @ 2021-12-05 16:01 明明1109 阅读(144) 评论(0) 推荐(0) 编辑
摘要:问题的引出 使用find_if时,可以用lambda表达式作为其第三个可调用对象的实参。然而,lambda表达式只适合用于简单的场景,如表达式只用一到两次。当可调用单元要要大量复用时,最好还是能写成函数形式,于是,我们写出check_size函数,用于过滤出尺寸大于sz的字符串。 bool chec 阅读全文
posted @ 2021-12-03 09:49 明明1109 阅读(465) 评论(0) 推荐(0) 编辑
摘要:运行时类型识别(run-time type idenfitication,RTTI)的功能由2个运算符实现: 1)typeid,用于返回表达式的类型; 2)dynamic_cast,用于将base class pointer(或reference)安全转型为derived class pointer 阅读全文
posted @ 2021-12-01 16:44 明明1109 阅读(140) 评论(0) 推荐(0) 编辑