11 2018 档案

摘要:总结由容器、迭代器、算法和函数对象组成的 STL 是个惯例 运用 STL 编程要知道什么时候使用循环,什么时候使用算法,什么时候使用容器成员函数 要知道 equal_range 什么时候是比 lower_bound 更好的搜索方式 知道 lower_bound 什么时候比 find 更优越,知道 f 阅读全文
posted @ 2018-11-30 18:58 KidyCharon 阅读(367) 评论(0) 推荐(0)
摘要:假设有一个 Widget* 指针和 list 和一个函数来决定指针是否确定一个有趣的 Widget: 找到第一个有趣的 Widget : 找到第一个不有趣的 Widget: 取而代之,必须对 isInteresting 应用 ptr_fun 在应用 not1 之前: ptr_fun做的唯一的事情是使 阅读全文
posted @ 2018-11-30 16:32 KidyCharon 阅读(151) 评论(0) 推荐(0)
摘要:1. 判断式是返回 bool (或者其他隐式转换为 bool 的东西)。判断式在 STL 中广泛使用。标准关联容器的比较函数是判断式,判断式函数常常作为参数传给算法,比如 find_if 和多种排序算法。 2. 纯函数是返回值只依赖于参数的函数。如果 f 是一个纯函数, x 和 y 是对象, f(x 阅读全文
posted @ 2018-11-30 14:37 KidyCharon 阅读(163) 评论(0) 推荐(0)
摘要:C 和 C++ 都不允许把真的函数作为参数传递给其他函数。取而代之,你必须传递指针给函数比如: 作为 cmpfcn 传递的实参是一个指向函数的指针,是从调用端拷贝给 qsort(值传递)。 C和C++标准库都遵循的一般准则: 函数指针是值传递 STL函数对象在函数指针之后成型,所以STL中的习惯是当 阅读全文
posted @ 2018-11-30 14:03 KidyCharon 阅读(175) 评论(0) 推荐(0)
摘要:有时候需要把整个区间提炼成一个单独的数,比如: count 告诉你区间中有多少等于某个值的元素,而 count_if 告诉你有多少元素满足一个判断式 区间中的最小和最大值可以通过 min_element 和 max_element 获得 accumulate 提供了更加灵活的算法,但需要自己定义判断 阅读全文
posted @ 2018-11-30 11:16 KidyCharon 阅读(281) 评论(0) 推荐(0)
摘要:STL 提供了 11 个名字带有 “copy” 的算法 copy copy_backward replace_copy reverse_copy replace_copy_if unique_copy remove_copy rotate_copy remove_copy_if partial_so 阅读全文
posted @ 2018-11-30 10:13 KidyCharon 阅读(296) 评论(0) 推荐(0)
摘要:怎么用 STL 进行忽略大小写的字符串的比较? 首先实现两个字符忽略大小写的比较: 基于 mismatch 算法,确定两个区间中第一个对应的不相同的值的位置 第二种方法 ciStringCompare 是产生一个合适的 STL 判断式:可以在关联容器中用作比较函数的函数,应用STL中名字第二长的算法 阅读全文
posted @ 2018-11-30 09:39 KidyCharon 阅读(228) 评论(0) 推荐(0)
摘要:不是所有的算法可以用于任意区间,比如: 1. remove 需要前向迭代器和可以通过这些迭代器赋值能力,所以不能应用于输入迭代器的划分区间,也不能是 map 或 multimap,也不能是 set 和 multiset 的一些实现。 2. 很多排序算法需要随机访问迭代器,所以不能在一个 list ( 阅读全文
posted @ 2018-11-29 19:44 KidyCharon 阅读(132) 评论(0) 推荐(0)
摘要:提防在指针的容器上使用类似 remove 的算法,容易造成内存泄漏。 选择处理动态分配指针的容器: 通过引用计数的智能指针 在调用类似 remove 的算法之前手动删除和废弃指针等 阅读全文
posted @ 2018-11-29 18:24 KidyCharon 阅读(110) 评论(0) 推荐(0)
摘要:remove 的声明: remove 接收指定它操作的元素区间的一对迭代器,不接收一个容器,所以不知道作用与哪个容器 remove 并不 “真的” 删除东西,因为它做不到 从容器中除去一个元素,唯一的方法是调用那个容器的一个成员函数,几乎都是 erase 的某种形式 remove 移动指定区间中的元 阅读全文
posted @ 2018-11-29 17:49 KidyCharon 阅读(264) 评论(0) 推荐(0)
摘要:排序出 20 个质量最高的 Widget,一种算法叫作 partial_sort: 选出任意 20 个质量最好的 widget(不排序),使用算法 nth_element: 选出前两个最好等级的元素,使用算法 partition: 完成后,widgets.begin() 到goodEnd的区间容纳了 阅读全文
posted @ 2018-11-29 15:18 KidyCharon 阅读(157) 评论(0) 推荐(0)
摘要:算法章: 1. 演示一些比较少见的算法使你的生活变得简单 2. 演示怎么避免算法常见的问题 STL 容器插入对象会出现的问题: 出现的问题:transform 被告知它的目的区间是从 results.end() 开始的, 而 *results.end() 没有对象,所以不存在对象的赋值 把 tran 阅读全文
posted @ 2018-11-29 13:56 KidyCharon 阅读(182) 评论(0) 推荐(0)
摘要:使用 istreambuf_iterator : 阅读全文
posted @ 2018-11-28 19:38 KidyCharon 阅读(229) 评论(0) 推荐(0)
摘要:要实现在一个 reverse_iterator ri 指出的位置上插入新元素,在 ri.base() 指向的位置插入就行了。对于 insert 操作而言,ri 和 ri.base() 是等价的,而且 ri.base() 真的是 ri 真的是 ri 对应的iterator 要实现在一个 reverse 阅读全文
posted @ 2018-11-28 19:09 KidyCharon 阅读(171) 评论(0) 推荐(0)
摘要:并不存在从 const_iterator 到 iterator 之间的隐式转换 一种安全的、可移植的方法获取他所对应的 iterator: 要得到与 const_iterator 指向同一位置的 iterator,首先将 iterator 指向容器的起始位置,然后把它向前移到和 const_iter 阅读全文
posted @ 2018-11-28 18:46 KidyCharon 阅读(209) 评论(0) 推荐(0)
摘要:每个标准容器类都提供四种迭代器类型,对于container<T>而言: 有些方法只接受 iterator 类型的参数 图片显示了从iterator到const_iterator、从iterator到reverse_iterator和从reverse_iterator到const_reverse_it 阅读全文
posted @ 2018-11-28 16:47 KidyCharon 阅读(585) 评论(0) 推荐(0)
摘要:散列容器: unordered_set、unordered_multiset、unordered_map、unordered_multimap 阅读全文
posted @ 2018-11-28 15:38 KidyCharon 阅读(182) 评论(0) 推荐(0)
摘要:假设有一个支持默认构造函数以及从一个 double 构造和赋值的 Widget 类: 现在让我们假设我们想建立一个从 int 到 Widget 的 map,初始化有特定值的映射: map::operator[] 被设计为简化 “添加或更新” 功能。即,给定 检查键 k 是否已经在 map 里,如果不 阅读全文
posted @ 2018-11-28 15:33 KidyCharon 阅读(346) 评论(0) 推荐(0)
摘要:标准关联容器的典型实现是平衡二叉查找树, 一个平衡二叉查找树是一个对插入、删除和查找的混合操作优化的数据结构 1. 建立。通过插入很多元素建立一个新的数据结构 2. 查找。在数据结构中查找指定的信息片。 3. 重组。修改数据结构的内容,也许通过删除所有现有数据和在原地插入新数据。 有时,一个 vec 阅读全文
posted @ 2018-11-28 13:51 KidyCharon 阅读(219) 评论(0) 推荐(0)
摘要:洗儿 苏轼 人皆养子望聪明,我被聪明误一生。 惟愿孩儿愚且鲁,无灾无难到公卿。 王熙凤“ 机关算尽太聪明,反误了卿卿性命 ” 曾国藩:天下之至拙,能胜天下之至巧 阅读全文
posted @ 2018-11-28 08:19 KidyCharon 阅读(197) 评论(0) 推荐(0)
摘要:正如所有标准关联容器,set 和 multiset 保持它们的元素有序,容器的正确行为依赖于它们保持有序,如果改变一个元素的值,新值不在正确的位置,将破坏容器的有序性。 对于 map 和 multimap 容器,改变容器里一个键值的程序不能编译, map<K, V> 或 multimap<K, V> 阅读全文
posted @ 2018-11-27 19:47 KidyCharon 阅读(176) 评论(0) 推荐(0)
摘要:除非比较函数总是为相等的值返回 false,否则将会打破所有的标准关联容器, 不管关联容器是否允许存在副本(set、map、multiset、multimap) 对于(set、map)使用 less_equal (<=): 结果为 false,当 insert(10A) 与 insert(10B) 阅读全文
posted @ 2018-11-26 16:09 KidyCharon 阅读(262) 评论(0) 推荐(0)
摘要:对于 string* 指针的 set,打印 set <string*> ssp 内容: 前一种循环的方式 *i 是指针。即使用 **i 替代,set 建立时按指针排序 copy的方式,编译器检测到迭代器传递的 string* 与ostream_iterator 需要打印对象不匹配。 string* 阅读全文
posted @ 2018-11-26 14:25 KidyCharon 阅读(153) 评论(0) 推荐(0)
摘要:find 算法和 set 的 insert 成员函数是很多必须判断两个值是否相同的函数代表, find 对 “相同” 的定义是相等,基于 operator== , set::insert 对 “相同” 的定义是等价,通常基于 operator< 。 操作上来说,相等的概念基于 operator== 阅读全文
posted @ 2018-11-26 10:58 KidyCharon 阅读(462) 评论(0) 推荐(0)
摘要:作为一个 STL 容器,vector<bool> 确实只有两个问题: 1. 它不是一个STL容器 2. 它并不容纳 bool 一个东西不能成为STL容器只因为会有人说它是(哈哈哈哈哈哈) vector不能编译下式: 因为vector<bool> 打包 bool 以节省空间,每个保存在“vector” 阅读全文
posted @ 2018-11-25 18:38 KidyCharon 阅读(343) 评论(0) 推荐(0)
摘要:避免 vector 持有它不再需要的内存,你需要把它从曾经最大的容量减少到它现在需要的容量。这样的减少容量的方法常被称为“收缩到合适”。可以这样做: vector 的复制构造函数拷贝数据到临时vector,这个临时vector没有多余的容量,交换后,销毁 同样技巧用于 string: 收缩到合适意味 阅读全文
posted @ 2018-11-25 18:14 KidyCharon 阅读(155) 评论(0) 推荐(0)
摘要:条款可以改为——宁可以编译器替换预处理器,因为 #define 可能不被视为语言的一部分 #define ASPECT_RATIO 1.653 解决之道是以一个常量替换宏(#define) const double AspectRatio = 1.653; 作为语言常量,AspecetRatio 肯 阅读全文
posted @ 2018-11-25 14:51 KidyCharon 阅读(188) 评论(0) 推荐(0)
摘要:C++ 是个多重泛型编程语言,一个同时支持过程形式(procedural)、面向对象形式(object-oriented)、函数形式(functional)、泛型形式(generic)、元编程形式(metaprogramming)的语言。 将 C++ 视为一个由相关语言组成的联邦而非单一语言,在其某 阅读全文
posted @ 2018-11-25 10:53 KidyCharon 阅读(120) 评论(0) 推荐(0)
摘要:已经存在的遗留的 C 风格 API 接受的是数组和 char* 指针,这样的 API 函数还将会存在很长时间,如果我们要有效使用 STL 的话,就必须和它们和平共处。 如果有一个 vector 对象 v,而你需要一个指向 v 中数据的指针,以使得它可以被当作一个数组,只要 &v[0] 就可以了。对于 阅读全文
posted @ 2018-11-24 08:39 KidyCharon 阅读(142) 评论(0) 推荐(0)
摘要:每个 string 实现都容纳了下面的信息: 1. 字符串的大小,也就是它包含的字符的数目; 2. 容纳字符串字符的内存容量; 3. 这个字符串的值,也就是,构成这个字符串的字符。 另外,一个字符串可能容纳: 1. 它的配置器的拷贝; 2. 依赖引用计数的 string 实现也包含了这个值的引用计数 阅读全文
posted @ 2018-11-23 21:25 KidyCharon 阅读(141) 评论(0) 推荐(0)
摘要:对于vector和string,当需要更多的空间,以realloc等价的思想来增长。类似于realloc的操作有四个部分: 1. 分配新的内存块,它有容器目前容量的几倍。大部分实现中,vector和string的容量以2为因数增长。 也就是说,当容器必须扩展时,它的容量每次翻倍。 2. 把所有元素从 阅读全文
posted @ 2018-11-23 20:51 KidyCharon 阅读(189) 评论(0) 推荐(0)
摘要:罗曼罗兰著《贝多芬传》 译者序 傅雷 唯有真实的苦难,才能驱除浪漫底克的幻想的苦难;唯有看到克服苦难的壮烈的悲剧,才能够帮助我们承担残酷的命运;唯有抱着“我不入地狱谁入地狱”的精神才能挽救一个萎靡而自私的民族:这是我十五年前初读到这本书时所得的教训。 不经过战斗的舍弃是虚伪的,不经劫难磨练的超脱是轻 阅读全文
posted @ 2018-11-23 19:42 KidyCharon 阅读(552) 评论(0) 推荐(0)
摘要:无论何时,准备动态分配一个数组,应该首先考虑使用一个 vector 或一个 string,vector 和 string 管理自己的内存,当元素添加到容器时,他们的内存会增长,而且当一个 vector 或 string 销毁时,它的析构函数会自动销毁容器中的元素,回收存放那些元素的内存。 vecto 阅读全文
posted @ 2018-11-23 11:00 KidyCharon 阅读(232) 评论(0) 推荐(0)
摘要:标准C++的世界是相当保守和陈旧的。在这个纯洁的世界,所有可执行文件都是静态链接的。不存在内存映射文件和共享内存。没有窗口系统,没有网络,没有数据库,没有其他进程。在这种情况下,当发现标准没有提到任何关于线程的东西时你不该感到惊讶。你对STL的线程安全有的第一个想法应该是它将因实现而不同。 在STL 阅读全文
posted @ 2018-11-23 10:06 KidyCharon 阅读(248) 评论(0) 推荐(0)
摘要:还没理解。。。。。。 回头再来 阅读全文
posted @ 2018-11-23 09:10 KidyCharon 阅读(188) 评论(0) 推荐(0)
摘要:去除一个容器中有特定值的所有对象: 如果容器是 vector、string 或 deque,使用 erase-remove惯用法 c.erase( remove( c.begin(), c.end() , val), c.end() ); // remove() 函数,将值不为 val 的元素前移, 阅读全文
posted @ 2018-11-22 21:04 KidyCharon 阅读(163) 评论(0) 推荐(0)
摘要:当拷贝一个 auto_ptr 时,auto_ptr 所指向对象的所有权被转到拷贝的 auto_ptr,而被拷贝的 auto_ptr 被设为 NULL。 拷贝一个 auto_ptr 将改变它的值,不要建立 auto_ptr 容器: vector< auto_ptr<Widget> > // Don`t 阅读全文
posted @ 2018-11-22 19:51 KidyCharon 阅读(140) 评论(0) 推荐(0)
摘要:STL 容器非常优秀。它们提供了前向和逆向遍历的迭代器(通过 begin、end、rbegin等);它们能告诉你所容纳的对象的类型(通过 value_type 和 typedef);在插入和删除中,它们负责任何需要的内存管理;它们报告容纳了多少对象和最多容纳的数量(分别通过 size 和 max_s 阅读全文
posted @ 2018-11-22 19:38 KidyCharon 阅读(207) 评论(0) 推荐(0)
摘要:声明一个函数 fun 带有一个 double 而且返回一个 int: 声明一个函数 gun 带有一个参数,参数指向一个没有参数、返回 double 的函数指针: Tip: C++ 里面的一条通用规则—— 几乎任何东西都可能被分析成函数声明 用括号包含一个实参声明是不合法的,但用括号包围一个函数调用的 阅读全文
posted @ 2018-11-22 18:47 KidyCharon 阅读(166) 评论(0) 推荐(0)
摘要:秦王使人谓安陵君曰:“寡人欲以五百里之地易安陵,安陵君其许寡人!” 安陵君曰:“大王加惠,以大易小,甚善;虽然,受地于王,愿终首之,弗感易!” 秦王不悦。安陵君因使唐雎使于秦。 秦王谓唐雎曰:“寡人以五百里之地易安陵,安陵君不听寡人,何也?且秦灭韩亡魏,而君以五十里之地存者,以君为长者,故不错意也。 阅读全文
posted @ 2018-11-22 17:55 KidyCharon 阅读(286) 评论(0) 推荐(0)
摘要:给定两个vector,v1和v2,使v1的内容和v2的后半部分一样的最简单的方式是什么? v1.assign( v2.begin() + v2.size()/2, v2.end() ); 两点说明: 1. assign成员函数对于所有标准序列容器(vector、string、deque和list)都 阅读全文
posted @ 2018-11-22 15:38 KidyCharon 阅读(188) 评论(0) 推荐(0)
摘要:对于方法 empty() 和 size() 应该首选 empty() 的构造, 理由很简单: 对于所有的标准容器,empty是一个常数时间操作,但对于一些 list 实现,size花费线性时间。 list::splice 实现 list 拼接的功能,将源 list 的内容部分或全部元素删除,拼插入到 阅读全文
posted @ 2018-11-22 14:23 KidyCharon 阅读(230) 评论(0) 推荐(0)
摘要:对于容器容纳对象、从容器中获取对象,STL的方式—— 拷进去、拷出来。 对象通过使用它的拷贝成员函数来拷贝: 特别是它的复制构造函数和它的赋值操作符(=) Widget( const Widget & ); Widget & operator = ( const Widget & ); 分割问题暗示 阅读全文
posted @ 2018-11-22 14:18 KidyCharon 阅读(157) 评论(0) 推荐(0)
摘要:C++中的代码重用 本章内容包括: Has-a关系 包含对象成员的类 模板类valarray 私有和保护继承 多重继承 虚基类 创建类模板 使用类模板 模板的具体化 C++ 的一个主要目标是促进代码重用,公有继承是实现这种目标的机制之一,但并不是唯一的机制,本章介绍其他方法: 1. 使用类成员:本身 阅读全文
posted @ 2018-11-21 21:53 KidyCharon 阅读(260) 评论(0) 推荐(0)
摘要:STL 是建立在泛化上的,数组泛化为容器,参数化了所包含的对象的类型。函数泛化为算法,参数化了所用的迭代器类型。指针泛化为迭代器,参数化了所指向对象的类型。 泛化继续,独立的容器类型泛化为序列或关联容器。标准的内存相邻的容器都提供随机访问迭代器,标准的基于节点的容器都提供双向迭代器。序列容器支持pu 阅读全文
posted @ 2018-11-21 21:41 KidyCharon 阅读(173) 评论(0) 推荐(0)
摘要:本章关注的是可以适合所有STL容器的指导方针: 选择适当容器时应该面对的约束; 避免产生为一个容器类型写的代码也可以用于其他容器类型的错觉; 容器里对象拷贝操作的重要性; 当指针或auto_ptr存放在容器中时出现的难点; 删除输入和输出; 可不可以使用自定义分配器; 达到最高效率的技巧和考虑在多线 阅读全文
posted @ 2018-11-21 20:12 KidyCharon 阅读(222) 评论(0) 推荐(0)
摘要:摘录: 说话说到有人厌恶,比起毫无动静来,还是一种幸福。 天下不舒服的人多着,而有些人却一心一意在造专给自己舒服的世界。这是不能如此便宜的,也给他们放一点可恶的东西在眼前,使他有时小不舒服,知道原来自己的世界也不容易十分美满。苍蝇的飞鸣,是不知道人们在憎恶他的;我却明知道,然而只要能飞鸣就偏要飞鸣。 阅读全文
posted @ 2018-11-19 18:10 KidyCharon 阅读(193) 评论(0) 推荐(0)
摘要:记录一下,总忘,出现问题解决问题,浪费时间。。。。。。。。。 用kinect2 跑ORB_SLAM2要安装 ROS、 安装Kinect2驱动 libfreenect2 以及ros接口 iai-kinect2 然后开始安装编译ORB_SLAM2: 1. github 下载源码解压 2. 添加环境变量在 阅读全文
posted @ 2018-11-15 22:01 KidyCharon 阅读(1092) 评论(0) 推荐(0)
摘要:string 和标准模板库 本章内容包括: 标准C++ string类 模板 auto_ptr、unique_ptr 和 shared_ptr 标准模板库(STL) 容器类 迭代器 函数对象 STL算法 模板 initializer_list 16.1 string 类 string 类由头文件 s 阅读全文
posted @ 2018-11-14 16:12 KidyCharon 阅读(480) 评论(0) 推荐(0)