C/C++
文章平均质量分 59
JIWilliams
这个作者很懒,什么都没留下…
展开
-
VS常用快捷键(VA插件)
1、查找和替换:Ctrl+F2、“Ctrl+K,D”:代码格式整理,你将发现“原来世界还是这么美好3、快速插入foreach、try等循环:Tab+ Tab4、回到光标前一位置: Ctrl + -;回到光标下一位置: Ctrl + Shift + -5、查找所有引用: Alt + Shit + F6、字符大小写转换: Ctrl + U将字符变为小...转载 2020-04-09 11:03:35 · 800 阅读 · 0 评论 -
CRC校验详解(附代码示例)
CRC校验即循环冗余校验(CyclicRedundancyCheck),是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。首先看两个概念,后续会用到。模2除法:也叫模2运算,就是结果除以2后取余数。模2除法每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在CRC计算中有应用到模2除法。 多项式与二进制:二进制可表示成多项式的形式,比如二进制1101表...转载 2019-11-08 10:51:31 · 9612 阅读 · 1 评论 -
进程 vs 线程
我们介绍了多进程和多线程,这是实现多任务最常用的两种方式。现在,我们来讨论一下这两种方式的优缺点。首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。如果用多线程实现...转载 2018-12-27 19:55:47 · 146 阅读 · 0 评论 -
C语言面试题
1 预处理问题1:什么是预编译?何时需要预编译?答:预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。.何时需要预编译:1、总是使用不经常改动的大型代码体。2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,...转载 2018-08-01 20:23:19 · 55168 阅读 · 6 评论 -
STL search搜索算法
在查找序列的子序列方面,search() 算法和 find_end() 算法相似,但它所查找的是第一个匹配项而不是最后一个。和 find_end() 算法一样,它也有两个版本,第二个版本接受用来比较元素的谓词作为第 5 个参数。可以用 search() 来验证前面使用 find_end() 搜索的结果。 如何改变每次遍历搜索的具体范围是它们的主要不同之处。下面是一个示例:string t...原创 2018-12-11 09:44:23 · 962 阅读 · 1 评论 -
STL find_end查找算法
find_end() 会在一个序列中查找最后一个和另一个元素段匹配的匹配项,也可以看作在一个元素序列中查找子序列的最后一个匹配项。这个算法会返回一个指向子序列的最后一个匹配项的第一个元素的迭代器,或是一个指向这个序列的结束迭代器。下面是一个示例:string text {"Smith, where Jones had had \"had\", had had \"had had\"." " ...原创 2018-12-11 09:28:08 · 455 阅读 · 0 评论 -
STL adjacent_find查找算法
adjacent_find() 算法可以用来搜索序列中两个连续相等的元素。用 == 运算符来比较连续的一对元素,返回的迭代器指向前两个相等元素中的第一个。如果没有一对相等的元素,这个算法返回这个序列的结束迭代器。例如:string saying {"Children should be seen and not heard."};auto iter = std::adjacent_find...原创 2018-12-11 09:11:55 · 362 阅读 · 0 评论 -
STL find_first_of查找算法
find_first_of() 算法可以在第一个序列中搜索第二个序列在第一个序列中第一次出现的任何元序列被搜索的范围由输入迭代器指定,但用于确定搜索序列的迭代器至少是正向迭代器。用 == 运算符来比较这两个序列中的元素,所以如果序列中是类类型的对象,这个类必须实现 operator==()。下面是一个使用 find_first_of() 的示例:string text {"The world...原创 2018-12-11 09:28:27 · 1411 阅读 · 0 评论 -
STL find_if_not查找算法
find_if_not() 可以在输入迭代器所定义的范围内查找单个对象,该算法会在前两个参数指定的范围内查找可以使第三个参数指定的谓词 返回 false 的第一个对象。谓词不能修改传给它的对象。find_if_not() 会返回一个指向被找到对象的迭代器,如果没有找到对象,会返回这个序列的结束迭代器。可以按如下方式用 find_if_not() 算法来查找使谓词为 false 的元素:v...原创 2018-12-10 17:16:09 · 211 阅读 · 0 评论 -
STL find_if查找算法
find_if() 同 find() 一样,为在输入迭代器所定义的范围内查找单个对象的算法,它可以在前两个参数指定的范围内查找可以使第三个参数指定的谓词返回 true 的第一个对象。谓词不能修改传给它的对象。find_if() 会返回一个指向被找到对象的迭代器,如果没有找到对象,会返回这个 序列的结束迭代器。可以按如下方式使用 find_if() 来查找 numbers 中第一个大于 va...原创 2018-12-10 17:02:24 · 467 阅读 · 0 评论 -
STL find查找算法
find() 为在输入迭代器所定义的范围内查找单个对象的算法,它可以在前两个参数指定的范围内查找和第三个参数相等的第一个对象。find 算法会返回一个指向被找到对象的迭代器,如果没有找到对象,会返回这个序列的结束迭代器。下面展示了如何使用 find():std::vector<int> numbers {5, 46, -5, -6, 23, 17, 5, 9, 6, 5};...原创 2018-12-10 16:53:56 · 459 阅读 · 0 评论 -
STL merge和inplace_merge算法
合并操作会合并两个有相同顺序的序列中的元素,可以是两个升序序列,也可以是两个降序序列。结果会产生一个包含来自这两个输入序列的元素副本的序列,并且排序方式和原始序列相同。图 1 说明了其工作方式。图1合并两个vector容器中的元素merge() 算法会合并两个序列并将结果保存到第三个序列中,它使用 < 运算符来比较元素。图 1 表明合并操作被运用到 these 和 those 容器...原创 2018-12-10 16:36:10 · 998 阅读 · 0 评论 -
STL is_sorted排序算法
排序是要耗费时间的,尤其是在有大量元素时。测试元素段是否已经排好序可以避免不必要的排序操作。如果两个迭代器参数所指定范围内的元素是升序排列的,函数模板 is_sorted() 就会返回 true。为了能够顺序处理元素,迭代器至少需要是正向迭代器。提醒一下,正向迭代器支持前缀和后缀形式的自增运算。下面是一个使用 is_sorted() 的示例:std::vector<int> ...原创 2018-12-10 16:01:59 · 966 阅读 · 0 评论 -
正则表达式
字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。...转载 2018-12-28 09:47:18 · 145 阅读 · 0 评论 -
STL search_n搜索算法
search_n() 算法会搜索给定元素的匹配项,它在序列中连续出现了给定的次数。它的前两个参数是定义搜索范围的正向迭代器,第 3 个参数是想要查找的第 4 个元素的连续匹配次数。例如:std::vector<double> values {2.7, 2.7, 2.7, 3.14, 3.14, 3.14, 2.7, 2.7};double value {3.14};int t...原创 2018-12-12 09:23:23 · 405 阅读 · 0 评论 -
STL partition分割算法
在序列中分区元素会重新对元素进行排列,所有使给定谓词返回 true 的元素会被放在所有使谓词返回 false 的元素的前面。这就是 partition() 算法所做的事。partition 的前两个参数是定义被分区序列范围的正向迭代器,第三个参数是一个谓词。下面展示如何使用 partition() 来重新排列序列中的值,所有小于平均值的元素会被放在所有大于平均值的元素的前面:std::v...原创 2018-12-12 09:44:10 · 824 阅读 · 0 评论 -
钩子函数是什么?
什么是钩子函数?先来看一段百科:钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。emmmm,认认真真读三遍。get关键词,在系统级对所有消息进行过滤,这是什么意思呢?是说钩子函数是在一个事件触发的时候,在系统级捕获到了他,然后做一...转载 2019-09-07 16:36:30 · 5407 阅读 · 0 评论 -
什么是字节对齐,为什么需要字节对齐
概念 在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。 为了使CPU能够对变量进行快速的访问,变量的起始地...转载 2019-09-07 15:01:09 · 15652 阅读 · 3 评论 -
STL swap_ranges交换序列算法
可以用 swap_ranges() 算法来交换两个序列。这个算法需要 3 个正向迭代器作为参数。前两个参数分别是第一个序列的开始和结束迭代器,第三个参数是第二个序列的开始迭代器。显然,这两个序列的长度必须相同。这个算法会返回一个迭代器,它指向第二个序列的最后一个被交换元素的下一个位置。例如:using Name = std::pair<string, string>; // Fi...原创 2018-12-25 09:43:11 · 295 阅读 · 0 评论 -
STL move移动算法
move() 算法会将它的前两个输入迭代器参数指定的序列移到第三个参数定义的目的序列的开始位置,第三个参数必须是输出迭代器。这个算法返回的迭代器指向最后一个被移动到目的序列的元素的下一个位置。这是一个移动操作,因此无法保证在进行这个操作之后,输入序列仍然保持不变;源元素仍然会存在,但它们的值可能不再相同了,因此在移动之后,就不应该再使用它们。如果源序列可以被替换或破坏,就可以选择使用 move...原创 2018-12-25 09:30:33 · 1338 阅读 · 0 评论 -
STL rotate_copy旋转算法
rotate_copy() 算法会在新序列中生成一个序列的旋转副本,并保持原序列不变。rotate_copy() 的前 3 个参数和 copy() 是相同的;第 4 个参数是一个输出迭代器,它指向目的序列的第一个元素。这个算法会返回一个目的序列的输出迭代器,它指向最后一个被复制元素的下一个位置。例如:std::vector<string> words {"one", "two",...原创 2018-12-25 09:06:57 · 292 阅读 · 0 评论 -
STL rotate旋转算法
rotate() 算法会从左边选择序列的元素。它的工作机制如图 1 所示。图1 rotate()算法的工作方式为了理解如何旋转序列,可以将序列中的元素想象成手镯上的珠子。rotate() 操作会导致一个新元素成为开始迭代器所指向的第一个元素。在旋转之后,最后一个元素会在新的第一个元素之前。rotate() 的第一个参数是这个序列的开始迭代器;第二个参数是指向新的第一个元素的迭代器,它必定在...原创 2018-12-25 09:00:29 · 1162 阅读 · 0 评论 -
STL copy_if复制算法
copy_if() 算法可以从源序列复制使谓词返回 true 的元素,所以可以把它看作一个过滤器。前两个参数定义源序列的输入迭代器,第三个参数是指向目的序列的第一个位置的输出迭代器,第 4 个参数是一个谓词。会返回一个输出迭代器,它指向最后一个被复制元素的下一个位置。下面是一个使用 copy_if() 的示例:std::vector<string> names {"A1", "B...原创 2018-12-19 11:50:29 · 709 阅读 · 0 评论 -
STL copy_n复制算法
copy_n() 算法可以从源容器复制指定个数的元素到目的容器中。第一个参数是指向第一个源元素的输入迭代器,第二个参数是需要复制的元素的个数,第三个参数是指向目的容器的第一个位置的迭代器。这个算法会返回一个指向最后一个被复制元素的后一个位置的迭代器,或者只是第三个参数——输出迭代器——如果第二个参数为 0。下面是一个使用它的示例:#include <unordered_set>...原创 2018-12-19 11:28:08 · 393 阅读 · 0 评论 -
STL binary_search二分查找算法
前面讲到的搜索算法都是对序列进行顺序搜索,而且没有事先对元素进行排序的要求。二分查找一般比顺序搜索要快,但要求序列中的元素是有序的。这主要是因为二分查找的搜索机制,图 1 说明了这种机制。图1 二分查找图 1 展示了在一个升序序列中二分查找 22 的过程。因为元素是升序排列的,所以查找机制使用小于运算符来查找元素。搜索降序序列需要使用小于运算符来比较元素。二分查找总是选择从序列中部的元素...原创 2018-12-12 11:00:09 · 576 阅读 · 0 评论 -
STL partition_point分割算法
可以用 partition_point() 算法来获取分区序列中第一个分区的结束迭代器,它的前两个参数定义检查范围的正向迭代器,最后一个参数是用来对序列进行分区的谓词。我们通常不知道每个分区中元素的个数,这个算法使我们能够访问和提取这些分区中的元素。例如:std::vector<double> temperatures {65, 75, 56, 48, 31, 28, 32, 2...原创 2018-12-12 10:15:21 · 452 阅读 · 0 评论 -
STL partition_copy分割算法
partition_copy() 算法以和 stable_partition() 相同的方式对序列进行分区,但那些使谓词返回 true 的元素会被复制到一个单独的序列中,使谓词返回 false 的那些元素会被复制到第三个序列中。这个操作不会改变原始序列。原始序列由前两个参数指定,它们必须是输入迭代器。第 3 个参数用来确定目的序列的开始位置,它会保存那些使谓词返回 true 的元素。第 4 个...原创 2018-12-12 09:52:02 · 316 阅读 · 0 评论 -
STL nth_element排序算法
nth_element() 算法和 partial_sort() 不同。应用的范围由它的第一个和第三个参数指定。第二个参数是一个指向第 n 个元素的迭代器。如果这个范围内的元素是完全有序的,nth_dement() 的执行会导致第 n 个元素被放置在适当的位置。这个范围内,在第 n 个元素之前的元素都小于第 n 个元素,而且它后面的每个元素都会比它大。算法默认用 <运算符来生成这个结果。...原创 2018-12-10 15:34:44 · 672 阅读 · 0 评论 -
STL partial_sort排序算法
通过示例很容易理解什么是部分排序。假设有一个容器,它保存了 100 万个数值,但我们只对其中最小的 100 个感兴趣。可以对容器的全部内容排序,然后选择前 100 个元素,但这可能有点消耗时间。这时候需要使用部分排序,只需要这些数中的前100个是有序放置的。对于部分排序,有一个特殊的算法 partial_sort(),它需要 3 个随机访问迭代器作为参数。如果这个函数的参数是 first、se...原创 2018-12-10 15:24:34 · 450 阅读 · 6 评论 -
STL stable_sort排序算法
sort() 算法可能会改变相等元素的顺序,有时候这不是我们想要的。假设有一个保存某种事务的容器,或许是银行账户。进一步假设,在处理它们之前,为了能够有序更新这些账户,需要按照账号对这些事务排序。如果出现相等事务的顺序反映的是它们添加到容器的时间顺序,就需要维持这个顺序不变。如果允许对给定账户的事务进行重新排列,可能会出现透支的情况。这种情况下,stable_sort() 算法可以满足我们的要...原创 2018-12-10 14:58:11 · 475 阅读 · 0 评论 -
STL equal_range二分查找算法
equal_range() 可以找出有序序列中所有和给定元素相等的元素。它的前两个参数是指定序列的两个正向迭代器,第三个参数是要查找的元素。这个算法会返回一个 pair 对象,它有两个正向迭代器成员,其中的 first 指向的是不小于第三个参数的一个元素,second 指向大于第三个参数的一个元素,所以我们也可以通过在单个调用中调用 lower_bound() 和 upper_bound() 来得...原创 2018-12-13 17:16:00 · 556 阅读 · 0 评论 -
STL upper_bound二分查找算法
二分查找一般比顺序搜索要快,但要求序列中的元素是有序的。这主要是因为二分查找的搜索机制,图 1 说明了这种机制。图 1 展示了在一个升序序列中二分查找 22 的过程。因为元素是升序排列的,所以查找机制使用小于运算符来查找元素。搜索降序序列需要使用小于运算符来比较元素。二分查找总是选择从序列中部的元素开始,并将它和搜索的值作比较。如果元素和被查找的元素相等,就认为是匹配的,所以当 !(x&l...原创 2018-12-13 16:22:31 · 336 阅读 · 0 评论 -
STL lower_bound二分查找算法
二分查找一般比顺序搜索要快,但要求序列中的元素是有序的。这主要是因为二分查找的搜索机制,图 1 说明了这种机制。图 1 展示了在一个升序序列中二分查找 22 的过程。因为元素是升序排列的,所以查找机制使用小于运算符来查找元素。搜索降序序列需要使用小于运算符来比较元素。二分查找总是选择从序列中部的元素开始,并将它和搜索的值作比较。如果元素和被查找的元素相等,就认为是匹配的,所以当 !(x&l...原创 2018-12-13 16:16:33 · 435 阅读 · 0 评论 -
STL copy_backward复制算法
不要被 copy_backward() 算法的名称所误导,它不会逆转元素的顺序。它只会像 copy() 那样复制元素,但是从最后一个元素开始直到第一个元素。copy_backward() 会复制前两个迭代器参数指定的序列。第三个参数是目的序列的结束迭代器,通过将源序列中的最后一个元素复制到目的序列的结束迭代器之前,源序列会被复制到目的序列中,如图 1 所示。copy_backward() 的 ...原创 2018-12-19 14:06:54 · 309 阅读 · 0 评论 -
指针解析
char a;char *b;char **c;a = 'a';b = &a;c = &b;printf("a的值(a):%c\n",a);printf("a的地址(&a):%p\n\n",&a);printf("b的值(b):%p\n",b);printf("b的地址(&b):%p\n",&b);printf(原创 2018-12-06 09:11:30 · 179 阅读 · 0 评论 -
C++学习笔记(七)
时间:2018/12/5地点:元征总部天气:骄阳似火 笔记1.basic_string和string类均提供了常规的迭代器和反向迭代器:(1)可以使用迭代器遍历string内的所...原创 2018-12-05 17:48:40 · 356 阅读 · 0 评论 -
C++ STL中istream_iterator和ostream_iterator的用法
C++ STL中定义了提供输入及输出用的iostream iterator类,称为istream_iterator和ostream_iterator,分别支持单一型别的元素读取和写入:(1)头文件:#include <iterator>(2)定义: 1)定义输入流迭代器:istream_iterator<std::string> is( std...原创 2018-12-05 17:41:13 · 1091 阅读 · 0 评论 -
C++学习笔记(五)
时间:2018/11/28地点:元征总部天气:多云 笔记1.#undef:#undef完成与#define相反的工作,它取消对传入的参数的宏定义#define MAX_WIDTH...原创 2018-11-28 11:41:22 · 199 阅读 · 0 评论 -
C++学习笔记(六)
时间:2018/12/4地点:元征总部天气:阳光明媚(12月深圳还是这么热!!) 笔记1.要使用string类,必须包含头文件<string>。在STL库中,basic_s...原创 2018-12-04 20:38:45 · 160 阅读 · 0 评论 -
C++学习笔记(四)
时间:2018/11/27地点:元征总部天气:多云 笔记1.模板特殊化:当模板中的pattern有确定的类型时,模板有一个具体的实现。(1)例如假设我们的类模板pair包含一个取模...原创 2018-11-27 17:19:30 · 197 阅读 · 0 评论