算法一
将这组数存入数组,用冒泡排序(或者其他排序方法)将这组数以递减 顺序进行排序,然后返回位于第 k – 1 位置的数,假如这组数中共有 10 个数的话:
我们知道,当我们使用数组名的时候实际上使用的是指向数组首元素的指针,实际上,使用数组名参加下标运算时本质上参加运算的仍然是指向数组首元素的指针:
所谓 C 风格的字符串即 以空字符结束的字符数组 。
下面定义了一个 string
对象:
1 | string s("Hello World"); |
允许使用字符串字面值来初始化 string 对象,更一般的情况下,能够出现字符串字面值的地方都能出现以空字符结束的字符数组:
使用数组来初始化 vector
对象,只需要 指明拷贝区域的首元素地址和尾后地址就可以了,下面通过两组程序及其运行结果来深入理解一下:
使用迭代器进行二分搜索是迭代器运算的一个经典案例之一,二分搜索是指在给定的 有序序列 中查找某个想要的元素的过程:
首先给出二分搜索的查找范围,然后通过计算得到所给范围中的中间位置元素的值,如果这个中间元素的值与所要查找的元素值相等,则搜索成功,程序完成,否则,比较这个中间元素的值与所要搜索的值的大小,倘若所要搜索的值大于这个中间元素的值,则所要搜索的值应该在这个有序序列的后半部分,此时,改变二分搜索所给范围的起始位置,重新计算新范围中间位置的元素所对应的值,倘若所要搜索的值小于这个中间元素的值,则所要搜索的值应该在这个有序序列的前半部分,此时,改变二分搜索所给范围的终止位置,重新计算新范围中间位置的元素所对应的值,重复以上过程,直至找到我们想要找到的元素或者没有元素可供继续搜索为止。
我的 Emacs 配置主要参考了 redguardtoo的专栏 , 主要的配置文件来自于 purcell ,在 purcell 的基础上,我做了一些满足我个人需要的修改,如 auto-complete 、 auto-complete-clang 等
标准库允许把字符串字面值和字符字面值转换为 string 对象,当把 string 对象和字符字面值以及字符串字面值混在一条语句中使用时,必须确保加法运算符( + )的两侧运算对象至少有一个是 string:
在使用 struct 关键字自定义类型的时候,通常我们希望自定义的类型能够在不同的源文件中共享,在这种情况下,我们需要把自定义的类型组织成头文件的形式,一般情况下,头文件的文件名与我们所定义的类型的名字相同,头文件通常还会多一个以 .h 结尾的后缀。
在自定义类型的时候,可能还会用到其他头文件的功能,在这种情况下,需要在自定义类型的头文件中包含另一个所用到的头文件,在自定义类型完成后,当源程序用到这种自定义的类型的时候,包含与之相关的头文件,就隐含地包含了定义这种自定义类型时用到的另一个头文件,而在源程序中,可能用到的自定义类型的数据成员与自定义类型时用到的另一个头文件有关,则又需要在源程序中包含另一个头文件一次,也就是说,源程序对于自定义类型中用到的头文件包含了两次,那么,怎么确保这两次包含都能正确地工作而不影响程序最后的结果呢?C++ 中使用预处理器来避免这种冲突。
类型别名
有两种方法可以定义类型别名:
1 | typedef double wages; // wages 是 double 的同义词 |
新标准规定了一种新的方法:
void*
指针是一种特殊的指针类型,可以存放任意对象的地址,一个 void*
指针存放着一个地址,这一点和其他指针类似,不同的是,我们对该地址中到底是个什么类型的对象并不了解:
1 | double obj = 3.14, *pd = &obj; |
利用 void*
指针能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*
指针,不能直接操作 void*
指针所指的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定能在这个对象上做哪些操作。